2010-12-07 3 views
7

テーブルからランダムな行を返すGrails GORM?私が持っている私のGrailsアプリケーションで

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

は、上記の条件に一致するテーブルの行数千人があるとします。しかし、テーブルから返される行はランダムではないようですが、返される20行のコンテキスト内では行がDbに格納されている順番にランダムになります。私のアプリケーションを動作させるには、このクエリは、行ID 203、行ID 3789、行ID 9087、行ID 789などのように、テーブルから完全にランダムな行を返すようにします。そんなことがあるものか?

+0

はあなたがDatasource.groovyでSQLログを有効にし、クエリはそれが生成されているかを見ることができますか?私はMySQLに対して同様のクエリを使用し、期待どおりに動作するようです。 – leebutts

+0

実際には、実行クエリを使用しています。私の答えを見て... – leebutts

答えて

12

私は以下のスタイルを使用します。

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

をし、それが(私たちはMySQLを使っている)、テーブル全体からランダムに行を返します。

なぜ実行クエリがfindAllとは異なる動作をするのかわかりません。

0

あなたが.withCriteriaを使用する場合は、そのworkaraoundを行うことができます。

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

それはいつかを言うことが重要です(作成基準クエリに依存します)、それはに「= 1」を追加する必要がありますsqlRestrictionは、生成されたクエリに "and"条件を追加します。 ですから、SQLE例外の使用を持っている場合:

sqlRestriction " 1=1 order by rand()" 
関連する問題