Grails GORM для возврата случайных строк из таблицы? - PullRequest
7 голосов
/ 07 декабря 2010

В моем приложении Grails у меня есть:

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

Предположим, что в таблице тысячи строк, соответствующих вышеуказанным критериям.Но кажется, что строки, которые возвращаются из таблицы, не случайны, а в том порядке, в котором строки хранятся в БД, хотя в контексте возвращаемых 20 строк они являются случайными.Чтобы мое приложение работало, я хочу, чтобы этот запрос возвращал полностью случайные строки из таблицы, как это может быть идентификатор строки 203, идентификатор строки 3789, идентификатор строки 9087, идентификатор строки 789 и т. Д.Как это возможно?

Ответы [ 2 ]

12 голосов
/ 07 декабря 2010

Я использую следующий стиль:

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

и возвращает случайные строки из всей таблицы (мы используем MySQL).

Я не уверен, почему выполнение запроса будет вести себя иначе, чем findAll.

0 голосов
/ 21 октября 2014

Если вы хотите использовать .withCriteria, вы можете обойти это:

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

Важно сказать, что когда-нибудь (в зависимости от созданного запроса Criteria) необходимо добавить «1 = 1»в sqlRestriction вызывают добавление условия «и» в сгенерированный запрос.Поэтому, если у вас есть исключение sqle, используйте:

sqlRestriction " 1=1 order by rand()"
...