2010-12-07 8 views
7

In meiner Grails-Anwendung Ich habe:Grails GORM, um zufällige Zeilen aus der Tabelle zurückzugeben?

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

Angenommen, es gibt Tausende von Zeilen in der Tabelle, die die oben genannten Kriterien entsprechen. Aber es scheint, dass die Zeilen, die von der Tabelle zurückgegeben werden, nicht zufällig sind, sondern in der Reihenfolge, in der die Zeilen in Db gespeichert sind, obwohl sie innerhalb des Kontexts von 20 zurückgegebenen Zeilen zufällig sind. Damit meine Anwendung funktioniert, möchte ich, dass diese Abfrage vollständig zufällige Zeilen aus der Tabelle zurückgibt, z. B. die Zeilen-ID 203, die Zeilen-ID 3789, die Zeilen-ID 9087, die Zeilen-ID 789 und so weiter. Wie ist das möglich?

+0

Können Sie auf SQL-Protokollierung aktivieren in Datasource.groovy und sehen, was die Abfrage, die erzeugt wird? Ich benutze eine ähnliche Abfrage gegen MySQL und es scheint zu funktionieren wie erwartet. – leebutts

+0

Tatsächlich verwenden wir die Ausführungsabfrage. Siehe meine Antwort ... – leebutts

Antwort

12

Ich verwende den folgenden Stil:

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

und es gibt zufällige Zeilen aus der gesamten Tabelle (wir verwenden MySQL).

Ich bin mir nicht sicher, warum die Ausführung der Abfrage sich anders als findAll verhält.

0

Wenn Sie eine .withCriteria verwenden mögen, können Sie diesen workaraound tun:

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

Es ist wichtig, dass irgendwann zu sagen (abhängig von den Abfragekriterien erstellt wird) ist es notwendig, ein „1 = 1“ hinzuzufügen, in sqlRestriction verursacht das Hinzufügen einer "and" -Bedingung in der generierten Abfrage. Also, wenn Sie eine SQLE Verwendung Ausnahme:

sqlRestriction " 1=1 order by rand()" 
Verwandte Themen