Как вы делаете лимитный запрос в HQL? - PullRequest
212 голосов
/ 06 августа 2009

В Hibernate 3 есть ли способ сделать эквивалент следующего ограничения MySQL в HQL?

select * from a_table order by a_table_column desc limit 0, 20;

Я не хочу использовать setMaxResults, если это возможно. Это определенно было возможно в более старой версии Hibernate / HQL, но, похоже, оно исчезло.

Ответы [ 10 ]

291 голосов
/ 06 августа 2009

Это было опубликовано на форуме Hibernate несколько лет назад, когда его спросили о том, почему это работает в Hibernate 2, но не в Hibernate 3:

Предел был никогда поддерживаемое предложение в HQL. Вы должны использовать setMaxResults ().

Так что, если он работал в Hibernate 2, похоже, что это было случайно, а не по замыслу. Я думаю это произошло потому, что анализатор HQL Hibernate 2 заменил бы биты запроса, который он распознал как HQL, и оставил бы все остальное, как было, чтобы вы могли проникнуть в какой-то собственный SQL. Hibernate 3, однако, имеет правильный синтаксический анализатор AST HQL, и он намного менее прощающий.

Я думаю, Query.setMaxResults() действительно ваш единственный вариант.

136 голосов
/ 14 февраля 2011
 // SQL: SELECT * FROM table LIMIT start, maxRows;

Query q = session.createQuery("FROM table");
q.setFirstResult(start);
q.setMaxResults(maxRows);
19 голосов
/ 06 августа 2009

Если вы не хотите использовать setMaxResults() для объекта Query, тогда вы всегда можете вернуться к использованию обычного SQL.

5 голосов
/ 08 декабря 2009

Если вы не хотите использовать setMaxResults, вы также можете использовать Query.scroll вместо list и получить нужные вам строки. Полезно для подкачки, например.

3 голосов
/ 12 января 2011

String hql = "select userName from AccountInfo order by points desc 5";

Это сработало для меня без использования setmaxResults();

Просто укажите максимальное значение в последнем (в данном случае 5) без использования ключевого слова limit. : P

1 голос
/ 15 марта 2019
@Query(nativeQuery = true,
       value = "select from otp u where u.email =:email order by u.dateTime desc limit 1")
public List<otp> findOtp(@Param("email") String email);
1 голос
/ 28 октября 2011

Если вы можете управлять лимитом в этом режиме

public List<ExampleModel> listExampleModel() {
    return listExampleModel(null, null);
}

public List<ExampleModel> listExampleModel(Integer first, Integer count) {
    Query tmp = getSession().createQuery("from ExampleModel");

    if (first != null)
        tmp.setFirstResult(first);
    if (count != null)
        tmp.setMaxResults(count);

    return (List<ExampleModel>)tmp.list();
}

Это действительно простой код для обработки лимита или списка.

1 голос
/ 27 июля 2010

Мое наблюдение состоит в том, что даже если у вас есть ограничение в HQL (hibernate 3.x), оно будет либо вызывать ошибку синтаксического анализа, либо просто игнорироваться. (если у вас есть порядок по + desc / asc до лимита, он будет проигнорирован, если у вас нет desc / asc до лимита, это вызовет ошибку синтаксического анализа)

0 голосов
/ 27 апреля 2018

Вам необходимо написать собственный запрос, см. this .

@Query(value =
    "SELECT * FROM user_metric UM WHERE UM.user_id = :userId AND UM.metric_id = :metricId LIMIT :limit", nativeQuery = true)
List<UserMetricValue> findTopNByUserIdAndMetricId(
    @Param("userId") String userId, @Param("metricId") Long metricId,
    @Param("limit") int limit);
0 голосов
/ 16 июля 2016
Criteria criteria=curdSession.createCriteria(DTOCLASS.class).addOrder(Order.desc("feild_name"));
                criteria.setMaxResults(3);
                List<DTOCLASS> users = (List<DTOCLASS>) criteria.list();
for (DTOCLASS user : users) {
                System.out.println(user.getStart());
            }
...