2010-12-07 40 views
7

Dans mon application Grails j'ai:Grailles GORM pour retourner des lignes aléatoires de la table?

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

On suppose qu'il ya des milliers de lignes dans le tableau correspondant aux critères ci-dessus. Mais il semble que les lignes renvoyées à partir de la table ne sont pas aléatoires mais dans l'ordre où les lignes sont stockées dans Db bien que dans le contexte des 20 lignes retournées, elles soient aléatoires. Pour que mon application fonctionne, je veux que cette requête renvoie des lignes complètement aléatoires de la table, comme cela pourrait être l'identifiant de ligne 203, l'identifiant de ligne 3789, l'identifiant de ligne 9087, l'identifiant de ligne 789, et ainsi de suite. Comment est-ce possible?

+0

Pouvez-vous activer la journalisation SQL dans Datasource.groovy et voir ce que la requête est qui est généré? J'utilise une requête similaire contre MySQL et il semble fonctionner comme prévu. – leebutts

+0

En fait, nous utilisons l'exécution de requête. Voir ma réponse ... – leebutts

Répondre

12

J'utilise le style suivant:

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

et renvoie des lignes aléatoires de la table entière (nous utilisons MySQL).

Je ne suis pas sûr que l'exécution de la requête se comporte différemment de findAll.

0

Si vous souhaitez utiliser un .withCriteria vous pouvez le faire workaraound:

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

Il est important de dire que quelque temps (en fonction de la requête Critères créé) il est nécessaire d'ajouter un « 1 = 1 » sqlRestriction provoque l'ajout d'une condition "et" dans la requête générée. Donc, si vous avez une utilisation d'exception SQLE:

sqlRestriction " 1=1 order by rand()"