Как вы выполняете предельный запрос в HQL?

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

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

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

Ответ 1

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

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

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

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

Ответ 2

 // SQL: SELECT * FROM table LIMIT start, maxRows;

Query q = session.createQuery("FROM table");
q.setFirstResult(start);
q.setMaxResults(maxRows);

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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();
}

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

Ответ 8

@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);

Ответ 9

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());
            }

Ответ 10

Вам нужно написать собственный запрос, обратитесь к этому.

@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);

Ответ 11

Вы можете легко использовать нумерацию страниц для этого.

    @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") })
    @Query("select * from a_table order by a_table_column desc")
    List<String> getStringValue(Pageable pageable);

Вы должны передать new PageRequest(0, 1) чтобы получить записи и из списка получить первую запись.