| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 27/03/2007 20:54:03
|
bonfarj
Java Ninja
![[Avatar]](/images/avatar/1454ca2270599546dfcd2a3700e4d2f1.jpg)
Membro desde: 28/03/2006 09:55:47
Mensagens: 298
Offline
|
Aqui na empresa nós utilizamos muito o Criteria.setMaxResults() para paginação. Eu criei um método para fazer uma busca por protótipo com o Hibernate e estou agora com um problema curioso. Esse método não suportava atributos que representassem coleções; o problema começou a aparecer quando isso foi implementado. Exemplo:
A classe Solicitacao possui um atributo List<ItemSolicitacao> e a classe ItemSolicitacao tem o atributo da classe Produto. Para fazer a pesquisa, eu preencho o objeto solicitacao, inicializo a lista itensSolicitacao e adiciono um objeto itemSolicitacao com o produto preenchido. Reparei que, ao fazer uma busca adicionando o nome do produto, caso existisse mais de um itemSolicitacao com aquele produto dentro de uma solicitacao, esta solicitacao aparecia repetida. Um amigo meu deu a dica e percebi que era um problema de uso de DISTINCT. Fiz uma busca no google e adicionei a seguinte linha:
Com isso o problema foi resolvido, ele não repetia os objetos que mencionei. Mas causou outro problema. Como falei no título do post, utilizo o método Criteria.setMaxResults() para paginação. A idéia é listar 15 objetos solicitacao por vez, mas ao invés de contar para solicitacao, o Hibernate agora conta para itemSolicitacao. Ou seja, se eu tenho objetos 10 solicitacao, cada um com 5 objetos itemSolicitacao, ele não mostra todos os 10 objetos solicitacao, mostra apenas 3 (3 x 5 = 15 objetos itemSolicitacao).
Alguém sabe como resolver isso, como colocar o maxResults para solicitacao e nao itemSolicitacao?
abração pra vcs!
|
IGOR BRITO ALVES
@igoralves
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/03/2007 13:33:10
|
bonfarj
Java Ninja
![[Avatar]](/images/avatar/1454ca2270599546dfcd2a3700e4d2f1.jpg)
Membro desde: 28/03/2006 09:55:47
Mensagens: 298
Offline
|
Acabo de ver que este problema está listado na página de problemas avançados do Hibernate (
Hibernate does not return distinct results for a query with outer join fetching enabled for a collection (even if I use the distinct keyword)?). Segue abaixo o trecho relacionado a minha questão:
It should be also obvious why resultset row-based "limit" operations, such as setFirstResult(5) and setMaxResults(10) do not work with these kind of eager fetch queries. If you limit the resultset to a certain number of rows, you cut off data randomly. One day Hibernate might be smart enough to know that if you call setFirstResult() or setMaxResults() it should not use a join, but a second SQL SELECT. Try it, your version of Hibernate might already be smart enough. If not, write two queries, one for limiting stuff, the other for eager fetching.
|
IGOR BRITO ALVES
@igoralves
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2007 16:25:11
|
bonfarj
Java Ninja
![[Avatar]](/images/avatar/1454ca2270599546dfcd2a3700e4d2f1.jpg)
Membro desde: 28/03/2006 09:55:47
Mensagens: 298
Offline
|
bonfarj wrote:Acabo de ver que este problema está listado na página de problemas avançados do Hibernate (
Hibernate does not return distinct results for a query with outer join fetching enabled for a collection (even if I use the distinct keyword)?). Segue abaixo o trecho relacionado a minha questão:
It should be also obvious why resultset row-based "limit" operations, such as setFirstResult(5) and setMaxResults(10) do not work with these kind of eager fetch queries. If you limit the resultset to a certain number of rows, you cut off data randomly. One day Hibernate might be smart enough to know that if you call setFirstResult() or setMaxResults() it should not use a join, but a second SQL SELECT. Try it, your version of Hibernate might already be smart enough. If not, write two queries, one for limiting stuff, the other for eager fetching.

Destaco o trecho "If not, write two queries, one for limiting stuff, the other for eager fetching.". Alguém saberia como poderia escrever essa query? A documentação do Hibernate fornece o seguinte exemplo:
Tendo tem vista o problema que exemplifiquei, como poderíamos escrever com duas queries, visando a paginação?
abraços!
|
IGOR BRITO ALVES
@igoralves
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 09/04/2008 17:15:39
|
cabradapeste
Debugger
Membro desde: 20/03/2008 15:01:45
Mensagens: 51
Offline
|
Estou com o mesmo problema. Quando uso paginação, todos os elementos da minha lista vêm repetidos. E quando uso criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY), apenas um único elemento é retornado, divergindo do que há no banco de dados.
This message was edited 1 time. Last update was at 09/04/2008 17:55:07
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 14/12/2011 11:30:22
|
vinnysoft
JavaGuru
![[Avatar]](/images/avatar/41147eabcdf237c41b03485364b8057e.jpg)
Membro desde: 21/09/2010 00:56:24
Mensagens: 225
Localização: Vitória - Espírito Santo
Offline
|
bonfarj wrote:Aqui na empresa nós utilizamos muito o Criteria.setMaxResults() para paginação. Eu criei um método para fazer uma busca por protótipo com o Hibernate e estou agora com um problema curioso. Esse método não suportava atributos que representassem coleções; o problema começou a aparecer quando isso foi implementado. Exemplo:
A classe Solicitacao possui um atributo List<ItemSolicitacao> e a classe ItemSolicitacao tem o atributo da classe Produto. Para fazer a pesquisa, eu preencho o objeto solicitacao, inicializo a lista itensSolicitacao e adiciono um objeto itemSolicitacao com o produto preenchido. Reparei que, ao fazer uma busca adicionando o nome do produto, caso existisse mais de um itemSolicitacao com aquele produto dentro de uma solicitacao, esta solicitacao aparecia repetida. Um amigo meu deu a dica e percebi que era um problema de uso de DISTINCT. Fiz uma busca no google e adicionei a seguinte linha:
Com isso o problema foi resolvido, ele não repetia os objetos que mencionei. Mas causou outro problema. Como falei no título do post, utilizo o método Criteria.setMaxResults() para paginação. A idéia é listar 15 objetos solicitacao por vez, mas ao invés de contar para solicitacao, o Hibernate agora conta para itemSolicitacao. Ou seja, se eu tenho objetos 10 solicitacao, cada um com 5 objetos itemSolicitacao, ele não mostra todos os 10 objetos solicitacao, mostra apenas 3 (3 x 5 = 15 objetos itemSolicitacao).
Alguém sabe como resolver isso, como colocar o maxResults para solicitacao e nao itemSolicitacao?
abração pra vcs!
Olá!
Sei que o post é antigo, mas vc conseguiu alguma solução?
Até +!
|
|
|
|
 |
|
|
|
|