2010-05-11 25 views
18

no puedo encontrar la manera de recuperar filas n al azar de una instancia criterios:Hibernate los criterios del API: conseguir n filas aleatorias

Criteria criteria = session.createCriteria(Table.class); 
criteria.add(Restrictions.eq('fieldVariable', anyValue)); 
... 

Entonces, ¿qué? No puedo encontrar ningún doc con los criterios del API

¿Quiere decir que debo usar HQL en su lugar?

Gracias!

EDIT: Me sale el número de filas por:

int max = criteria.setProjecxtion(Projections.rowCount()).uniqueResult(); 

¿Cómo recuperar filas n al azar con índices entre 0 y max? ¡De nuevo!

Respuesta

43

En realidad, es posible con Criteria y un poco de ajuste.Aquí es cómo:

Criteria criteria = session.createCriteria(Table.class); 
criteria.add(Restrictions.eq('fieldVariable', anyValue)); 
criteria.add(Restrictions.sqlRestriction("1=1 order by rand()")); 
criteria.setMaxResults(5); 
return criteria.list(); 

cualquier Restrictions.sqlRestriction añadirá la palabra clave 'y'; para anular su efecto, , agregaremos una condición ficticia e inyectaremos nuestra función rand().

+1

¡Eso fue conveniente y me ayudó! – Nischal

+1

No devuelve registros únicos ... – Imran

+2

¿Cuál es el propósito de 1 = 1 en restricciones sql. Obtengo el resultado correcto con él, y sin esto recibo un error –

0

No se pueden obtener filas aleatorias de forma eficiente, lo siento. Hibernate solo puede hacer lo que SQL hace, y la obtención de filas aleatorias simplemente no es parte de ninguna implementación estándar de SQL que yo sepa, de hecho, es de mi conocimiento que no forma parte de CUALQUIER SQL del que sea consciente (cualquiera, por favor, ilumíname).

Y como Hibernate es un asignador de O/R, y no una máquina de extrañar, sólo puede hacer lo que es compatible con la base de datos subyacente.

Si usted tiene un conocido envió con números ascendentes y sabe inicio y final, puede generar un número aleatorio en el equipo y pedir esa fila.

+0

Estas son consideraciones excelentes, aunque la eficiencia no era su principal preocupación. – fabspro

+0

Mysql no se ordena por medio de rand() –

1

La API de Criteria no ofrece instalaciones para esto. Sin embargo, en MySQL, puede usar ORDER BY RAND() LIMIT n para esto, donde n representa la cantidad de filas aleatorias que desea buscar.

SELECT col1, col2, col3 FROM tbl ORDER BY RAND() LIMIT :n 

De hecho, necesita ejecutarlo como HQL.

6

En primer lugar, tenga en cuenta que no existe una forma estándar de hacer esto en SQL, cada motor de base de datos utiliza su propia sintaxis patentada . Con MySQL, la instrucción SQL para obtener 5 filas aleatorias serían:

SELECT column FROM table 
ORDER BY RAND() 
LIMIT 5 

Y usted podría escribir esta consulta en HQL porque la orden por cláusula en HQL se pasa a través de la base de datos esta manera puede utilizar cualquier función .

String query = "SELECT e.attribute FROM MyEntity e ORDER BY RAND()"; 
Query q = em.createQuery(query); 
q.setMaxResults(5); 

Sin embargo, a diferencia de HQL, la API de criterios actualmente no es compatible con ORDER BY SQL Native (ver HHH-2381) y en el estado actual, se tendría que subclase de la clase Order para implementar esta característica. Esto es posible, refiérase al problema de Jira, pero no disponible de manera inmediata.

Entonces, si realmente necesita esta consulta, mi recomendación sería usar HQL. Solo tenga en cuenta que no será portátil.

Otros lectores que desee comprobar el puesto SQL to Select a random row from a database table para ver cómo implementar esto con MySQL, PostgreSQL, Microsoft SQL Server, IBM DB2 y Oracle.

+0

Hibernate me dice que no existe una función como "RAND", que utiliza pg @ java7, hmm ... ¿Qué hizo mal? -> es aleatorio() en el caso de pg, lo siento molestar – Chris

Cuestiones relacionadas