2010-12-07 27 views
7

En mi solicitud griales que tengo:Grails GORM para devolver filas aleatorias de la tabla?

keywords = Keyword 
    .findAll("from Keyword where locale = '$locale' order by rand() ", [max:20]) 

Supongamos que hay miles de filas de la tabla que coinciden con los criterios anteriores. Pero parece que las filas que se devuelven de la tabla no son aleatorias, sino que en el orden en que se almacenan las filas en Db, aunque dentro del contexto de 20 filas que se devuelven, son aleatorias. Para que mi aplicación funcione, quiero que esta consulta devuelva filas completamente aleatorias de la tabla, como podría ser la Id. De fila 203, Id. De fila 3789, Id. De fila 9087, Id. De fila 789, y así sucesivamente. ¿Cómo es eso posible?

+0

¿Se puede activar el registro de SQL en Datasource.groovy y ver lo que se que se está generando la consulta? Uso una consulta similar contra MySQL y parece funcionar como se esperaba. – leebutts

+0

En realidad, estamos usando ejecutar consulta. Ver mi respuesta ... – leebutts

Respuesta

12

utilizo el siguiente estilo:

Keyword.executeQuery('from Keyword order by rand()', [max: 9]) 

y devuelve filas al azar de toda la tabla (estamos usando MySQL).

No estoy seguro de por qué ejecutar la consulta se comportaría de manera diferente de findAll though.

0

Si desea utilizar un .withCriteria que puede hacer que workaraound:

User.withCriteria{ 
eq 'name', 'joseph' 
sqlRestriction " order by rand()" 
} 

Es importante decir que en algún momento (depende de la consulta Criterios creado) es necesario añadir un "1 = 1" en sqlRestriction porque agrega una condición "y" en la consulta generada. Así que si usted tiene una excepción de uso sqle:

sqlRestriction " 1=1 order by rand()" 
Cuestiones relacionadas