Как вы выполняете предельный запрос в 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)
чтобы получить записи и из списка получить первую запись.