Paginação com Hibernate  XML
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Autor Mensagem
andre_a_s
GUJ Ranger
[Avatar]

Membro desde: 23/02/2003 01:04:53
Mensagens: 755
Localização: Santo André(SP)
Offline

Bo dia senhores.

Possuo um objeto A que possui uma collection de objetos B
Um determinado objeto A, possui quase 40.000 objetos B, e tenho uma tela que lista todos ops objetos B. O grande problema é que 40.000 objetos selecionados na tela acaba dando OutOfMemory.
O mais correto seria fazer uma paginação, onde selecionaria apenas 50 objetos B de cada vez.
Pergunta: Como posso fazer isso, se ao executar a.getBs(), o Hibernate já me retorna tudo de uma vez ? Com query nativa, eu faria os selects em lote e tudo se resolveria, mas não gostaria de criar essas consultas nativas.

Como posso resolver isto ?

Gosta de cerveja e de viagem?
Visite meu blog!
http://www.TravelAndBeer.com
[Email] [MSN] [ICQ]
marcelo.martins
What is classpath?

Membro desde: 24/03/2010 12:15:57
Mensagens: 7
Offline

Ola Vc pode fazer assim:

Contando os registros.




Paginado o seu resultado:



Qualquer duvida poste ai...

This message was edited 1 time. Last update was at 08/04/2010 11:51:17

andre_a_s
GUJ Ranger
[Avatar]

Membro desde: 23/02/2003 01:04:53
Mensagens: 755
Localização: Santo André(SP)
Offline

Sim, via HQL é possivel, mas seria possivel SEM HQL ?

Gosta de cerveja e de viagem?
Visite meu blog!
http://www.TravelAndBeer.com
[Email] [MSN] [ICQ]
garcia-jj
JWizard

Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline

andre_a_s wrote:Sim, via HQL é possivel, mas seria possivel SEM HQL ?


O que seria sem HQL? Com criteria?

http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum.
roger_rf
GUJ Master

Membro desde: 29/04/2009 07:40:19
Mensagens: 1091
Localização: Natal/RN
Offline

Não sei se é exatamente isso que você procura, mas talvez a técnica de "batch fetching" seja útil:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-fetching-batch

andre_a_s
GUJ Ranger
[Avatar]

Membro desde: 23/02/2003 01:04:53
Mensagens: 755
Localização: Santo André(SP)
Offline

garcia-jj wrote:
andre_a_s wrote:Sim, via HQL é possivel, mas seria possivel SEM HQL ?


O que seria sem HQL? Com criteria?


Não necessariamente.
Por exemplo, hoje, quando executo a.getBs(), ele me traz todos os objetos B dentro de A. Isso não é feito via HQL, é feito automático pelo mapeamento.
Estou procurando uma alternativa para trazer os mesmos objetos B, executando por exemplo getBs(1, 50), para pegar do primeiro ao quinquagésimo.

Minha duvida é, este tipo de coisa só é possivel via HQL/Criteria, ou é possivel fazer via mapeamento, como o link que roger_rf passou ?

Gosta de cerveja e de viagem?
Visite meu blog!
http://www.TravelAndBeer.com
[Email] [MSN] [ICQ]
marcelo.martins
What is classpath?

Membro desde: 24/03/2010 12:15:57
Mensagens: 7
Offline

Ola,

O mapeamento do objeto A ou B individualmente, vc pode fazer da forma de exemplifiquei ou por Criteria...
Se quizer te mostro como fazer com Criteria,

Porem se vc tem este cenario:



Então neste cenario, acredito que não tenha como vc paginar a lista B,
Posso estar dizendo besteira, mas pense bem:
Como vc ia estar limitando o numero de registros dentro desta lista?
No minimo o hibernate teria que manter a sessão aberta e ficar gerenciando sua interação em tempo de execução...
Não sei se tem como vc fazer isso...

O que vc pode estar fazendo é remover o objeto filho, e tratalo de forma independente.
Porem ja te adiantando, se vc fizer por exemplo um combo com sujestion, ficara pesado tambem.

Mas se a sua consulta estiver muito pesada com o objeto filho dentro de A, vc pode remove-lo...(dependendo de como estão suas telas e relacionamentos)
garcia-jj
JWizard

Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline

Pelo que entendi você quer fazer paginação pelo mapeamento one-to-many da entidade, e isso não é possível.

Na verdade eu sou bem contra fazer mapeamentos bidirecionais to tipo one-to-many e many-to-one. No seu caso A possui muitos B, então o correto é A não possuir a coleção de B, mas B possuir a referencia para A. Não gosto de usar A.getB, e um dos motivos é de você carregar todos os registros da base sem distinção.

O mais correto, na minha opinião, é você fazer uma chamada via HQL ou criteria para trazer todos os B que são filhos de A com seus critérios de paginação.
Tecnoage
GUJ Master

Membro desde: 13/03/2005 23:18:07
Mensagens: 1723
Localização: SP
Offline

eu tb estava algum tempo atrás procurando uma resposta para isso, acabei construindo via query mesmo...

Arquiteto de Software
Sysped Solutions
R3 SAP CAT-83, NF-e, ECD, EFD, CT-e, MANAD, IN86
www.sysped.com.br
[Email] [WWW] [MSN]
thiago.correa
GUJ Master
[Avatar]

Membro desde: 26/03/2006 18:54:30
Mensagens: 1861
Offline

Foi por coincidência que eu achei isso na documentação do hibernate, veja se adianta


---
"Se não puder ajudar, atrapalhe, afinal de contas o importante é participar!"
Thiago
[MSN]
Tecnoage
GUJ Master

Membro desde: 13/03/2005 23:18:07
Mensagens: 1723
Localização: SP
Offline

funcionalmente é desse modo que se faz, porém o que procurei ( e ainda procuro ) é algum mecanismo que faça para um relacionamento 1:N lazy, por exemplo a paginação automática, sem a necessidade de criar uma hql ou uma critéria para isso.

Arquiteto de Software
Sysped Solutions
R3 SAP CAT-83, NF-e, ECD, EFD, CT-e, MANAD, IN86
www.sysped.com.br
[Email] [WWW] [MSN]
garcia-jj
JWizard

Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline

Tecnoage wrote:funcionalmente é desse modo que se faz, porém o que procurei ( e ainda procuro ) é algum mecanismo que faça para um relacionamento 1:N lazy, por exemplo a paginação automática, sem a necessidade de criar uma hql ou uma critéria para isso.


Se você ler meu comentário verá que realmente usando o relacionamento não há como fazer paginado. E se você procurar na community manuals do hibernate (não sei se no site do jboss novo tem isso) há um post que fala exatamente do quão ruim é você ter bidirecionais e sair usando algo como:



Sendo que o correto é você ter apenas o relacionamento de Debit.customer, e não ambos Debit.customer e Customer.debits.

A forma mais correta de você paginar é usar o que o Thiago indicou no post dele. Formula mágina para paginação você não irá encontrar.

http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum.
Tecnoage
GUJ Master

Membro desde: 13/03/2005 23:18:07
Mensagens: 1723
Localização: SP
Offline

garcia-jj wrote:
Tecnoage wrote:funcionalmente é desse modo que se faz, porém o que procurei ( e ainda procuro ) é algum mecanismo que faça para um relacionamento 1:N lazy, por exemplo a paginação automática, sem a necessidade de criar uma hql ou uma critéria para isso.


Se você ler meu comentário verá que realmente usando o relacionamento não há como fazer paginado. E se você procurar na community manuals do hibernate (não sei se no site do jboss novo tem isso) há um post que fala exatamente do quão ruim é você ter bidirecionais e sair usando algo como:



Sendo que o correto é você ter apenas o relacionamento de Debit.customer, e não ambos Debit.customer e Customer.debits.

A forma mais correta de você paginar é usar o que o Thiago indicou no post dele. Formula mágina para paginação você não irá encontrar.



Não estamos falando necessariamente em relacionamentos bidirecionais, muito pelo contrário.
A meu ver essa paginação AINDA é burra, força meu código "cliente" a fazer iterações baseadas em limites da query. Em termos de código LIMPO, essa é a pior solução, mas até onde encontrei é a única.

Isso geralmente resolve os problemas de sistemas onde ALGUMAS queries podem "explodir" a memória, mas torna sistemas com monstruosas quantidades de informações labirintos lógicos.

E esse é somente uma das limitações do hibernate. Existem uma série de outras, como a não inclusão de tipos PK (simples ou compostas) e qualquer relacionamento em queries do tipo example, por exemplo...

Arquiteto de Software
Sysped Solutions
R3 SAP CAT-83, NF-e, ECD, EFD, CT-e, MANAD, IN86
www.sysped.com.br
[Email] [WWW] [MSN]
 
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Ir para:   
Powered by JForum 2.1.8 © JForum Team