[Hibernate] Problemas com Criteria.setMaxResults()

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:

criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

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!

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:

:cry:

[quote=bonfarj]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:

:cry:[/quote]

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?

abraços!

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:

criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

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?

Até +!