Hibernate - order by "Random"  XML
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Autor Mensagem
nicoweda
JavaChild
[Avatar]

Membro desde: 04/04/2005 10:44:40
Mensagens: 122
Offline

Eu já dei uma pesquisa sobre o assunto mas ainda não encontrei nada que possa me ajudar.
O problema é:

Preciso fazer uma ordenação randomica utilizando HQL e pegar N resultados.
Ainda não consegui fazer isso e não encontrei nenhuma literatura que possa me auxiliar...

Alguem já precisou de algo parecido e conseguiu delegr ao banco essa ordenação?

Abraços

Bruno Nicoletti Siqueira
[MSN]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline

Invés de selecionar Randomincamente no banco pega tudo depois você pode na classe mistura

Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

O problema de pegar aleatoriamente N registros não se resolve facilmente. Não com hiberante e nem com SQL puro. Nem todos os bancos têm formas de fazer isto, e os que têm normalmente são formas não-padrão.
Pegar todos os registros para escolher depois pode ser demasiado oneroso. Imagine-se um banco de 1000 produtos dos quais meia duzi tem que ser mostrados aleatoriamente na homepage...
A solução é trade-off. Se a tabela que queres randomizar tem poucos menbros podes puxar todos e usar os mecanimos de Collections.suffle() para conseguir o efeito.Uma opção é puxar apenas as chaves , randomizar escolher N fazer um query de volta com essas chaves Puxar 1000 chaves é menos oneroso que 1000 entidades
Caso contrário tens que pesquisar uma frase SQL para o banco que usares e executar explicitamente. (lá se vai a independencia do banco)

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 5932
Localização: São Paulo/SP
Offline

Ou então usar um
Hibernate.load(SuaClass.class, new Random().nextLong(100);
ou algo assim num for

Facebook @MarkyHitchhiker +Mark WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
nicoweda
JavaChild
[Avatar]

Membro desde: 04/04/2005 10:44:40
Mensagens: 122
Offline

Então,

Pegar todos está fora de cogitação pra mim...
Fazer o eskema do load(SubClass.class rdm.nextInt(x) ); também não me serve... como vou garantir que o id que eu peguei randomicamente realmente vai estar ali...?
Mas tive uma ideia que ainda está meio crua...

primeiro eu faço um count (N) e depois eu faço o criteria definindo como o umero maximo de resultados 1 e passando o index da primeira linha.
Este index vai ser um numero randomico entre 0 e N.
Foi a unica maneira que eu encontrei de fazer um random que realmente funcione para todos os casos...
Porém ainda tem uma brecha!

E quando eu quizer mais de 1 ? Faço a mesma coisa novamente? ainda não consegui pensar em outra possibilidade...

Ajudas são bem vindas!

Bruno Nicoletti Siqueira
[MSN]
JorgeDemetrio
Smalltalk
[Avatar]

Membro desde: 19/08/2011 10:21:47
Mensagens: 4
Offline

Cara nessa caso recomento que use query nativa

Ex NO BEAN PRODUTO:


EX NO SERVICE





Jorge Demetrio

AllDreams, desenvolvimento de e-commerce e sites
Zoha notícias
[WWW] [MSN] [ICQ]
 
Índice dos Fóruns » Ferramentas, Frameworks e Utilitários
Ir para:   
Powered by JForum 2.1.8 © JForum Team