Ordenação com Criteria

5 respostas
A

Pessoal, estou precisando retornar uma lista ordenada de forma randomica. Ja vi que o sql suporta isso com order by rand() e vi na api do hibernate que ele suporta essa funcao tb, mas queria usar ela com Criteria e não com HQL. Alguém sabe como fazer? To procurando aqui mas não acho.

Alberto

5 Respostas

_fs

Pergunta interessante. Pesquisei e encontrei mais pessoas com o mesmo problema, mas nenhuma solução.

Dei uma olhada na classe org.hibernate.criterion.Order, e me pareceu simples criar uma extensão para ela. Aqui uma tentativa não testada:
public class RandomOrder extends Order
{
	protected RandomOrder()
	{
		super( null, true );
	}

	@Override
	public String toSqlString( Criteria criteria, CriteriaQuery criteriaQuery ) throws HibernateException
	{
		NoArgSQLFunction noArgSQLFunction = ( NoArgSQLFunction ) criteriaQuery
				.getFactory()
					.getDialect()
					.getFunctions()
					.get( "rand" );
		String function = noArgSQLFunction.render( new ArrayList< String >(), null );
		return function;
	}
}
Ai para usar, faria:
criteria.addOrder( new RandOrder() );

Agora, porque essa solução é inadequada?
http://www.petefreitag.com/item/466.cfm

A

Eu tinha dado uma olhada tb, ja tinha até criado a classe que herdava, mas tava ainda pensando com faria, pois não tinha o conhecimento que vc postou. vou testar sua dica, e posto aqui o resultado. Eu tava olhando os dialetos, e usando rand funciona para mysql,SqlServer entre outros. O que lembro que não rola, era o PostGreSQL

A

Massa, funcionou. Valeu pela ajuda Lipe, quando vc chama o getFunctions().get(“rand”) ele ja aplica a funcao na query que vai ser gerada é? bem legal isso

_fs

Hm, não aplica nesse momento não.

A linha de código que você indicou apenas acessa as funções registradas pelo dialect. Dê uma olhada nas classes filhas de Dialect para entender melhor.

Fico feliz que funcionou, mas lembre-se que a função não é portável.

A

Blz, eu to sabendo que não é portavel, mas no momento ajuda e muito. Eu dei uma olhada nos dialects e vi que a funcao ta registrada lá. E fica legal, pq agora quando quiser aplicar uma ordenação mais diferente já tenho o caminho.

Alberto

Criado 11 de abril de 2008
Ultima resposta 12 de abr. de 2008
Respostas 5
Participantes 2