Grails GORM для возврата случайных строк из таблицы?
В моем приложении Grails у меня есть:
keywords = Keyword
.findAll("from Keyword where locale = '$locale' order by rand() ", [max:20])
Предположим, что в таблице есть тысячи строк, соответствующих вышеуказанным критериям. Но кажется, что строки, которые возвращаются из таблицы, не случайны, а в том порядке, в котором строки хранятся в БД, хотя в контексте 20 возвращаемых строк они являются случайными. Чтобы мое приложение работало, я хочу, чтобы этот запрос возвращал полностью случайные строки из таблицы, как это может быть идентификатор строки 203, идентификатор строки 3789, идентификатор строки 9087, идентификатор строки 789 и т. Д. Как это возможно?
2 ответа
Я использую следующий стиль:
Keyword.executeQuery('from Keyword order by rand()', [max: 9])
и он возвращает случайные строки из всей таблицы (мы используем MySQL).
Я не уверен, почему выполнение запроса будет вести себя иначе, чем findAll.
Если вы хотите использовать.withCriteria, вы можете сделать это обходным путем:
User.withCriteria{
eq 'name', 'joseph'
sqlRestriction " order by rand()"
}
Важно сказать, что когда-то (зависит от созданного запроса Criteria) необходимо добавить " 1=1 " в sqlRestriction, потому что оно добавляет условие "и" в сгенерированный запрос. Поэтому, если у вас есть исключение sqle, используйте:
sqlRestriction " 1=1 order by rand()"