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 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?
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:
SELECT o.*, l.* from ORDER o LEFT OUTER JOIN LINE_ITEMS l ON o.ID = l.ORDER_ID
Tendo tem vista o problema que exemplifiquei, como poderíamos escrever com duas queries, visando a paginação?
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.
[quote=bonfarj]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 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!
[/quote]
Olá!
Sei que o post é antigo, mas vc conseguiu alguma solução?