[Hibernate] Problemas com Criteria.setMaxResults()  XML
Índice dos Fóruns » Desenvolvimento Web
Autor Mensagem
bonfarj
Java Ninja
[Avatar]

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
bonfarj
Java Ninja
[Avatar]

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
bonfarj
Java Ninja
[Avatar]

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
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

vinnysoft
JavaGuru
[Avatar]

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é +!



 
Índice dos Fóruns » Desenvolvimento Web
Ir para:   
Powered by JForum 2.1.8 © JForum Team