Hibernate - order by "Random"

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

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

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)

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

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!

Cara nessa caso recomento que use query nativa

Ex NO BEAN PRODUTO:


@NamedNativeQueries({ @NamedNativeQuery(name = "getProdutoRandom", query = "SELECT * FROM tbl_produto WHERE status <> 'REMOVIDO' ORDER BY RAND() "), })

EX NO SERVICE


getSession().getNamedQuery("getProdutoRandom").setMaxResults(maxResults).list()