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?
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)
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...