HQL에서 제한 쿼리를 어떻게 수행합니까?
최대 절전 모드 3에서는 HQL에서 다음과 같은 MySQL 제한을 수행하는 방법이 있습니까?
select * from a_table order by a_table_column desc limit 0, 20;
가능한 경우 setMaxResults를 사용하고 싶지 않습니다. 이것은 이전 버전의 Hibernate / HQL에서 가능했지만 사라진 것 같습니다.
이것은 몇 년 전 Hibernate 2에서는 작동했지만 Hibernate 3에서는 작동하지 않는 이유에 대해 물었을 때 Hibernate 포럼 에 게시 되었습니다.
HQL에서는 제한이 지원되는 조항 이 아닙니다 . setMaxResults ()를 사용해야합니다.
따라서 최대 절전 모드 2에서 작동하면 디자인이 아니라 우연의 일치 인 것 같습니다. 내가 생각하는 일부 네이티브 SQL에 몰래 수 있도록 최대 절전 모드 2 HQL 파서, 그것은 HQL로 인식하는 쿼리의 비트를 교체하고 그것이로 나머지를 떠날 것 때문이었다. 그러나 최대 절전 모드 3에는 적절한 AST HQL 파서가 있으며 훨씬 덜 용서합니다.
Query.setMaxResults()
정말 유일한 옵션 이라고 생각 합니다.
// SQL: SELECT * FROM table LIMIT start, maxRows;
Query q = session.createQuery("FROM table");
q.setFirstResult(start);
q.setMaxResults(maxRows);
사용하지 않으려면 setMaxResults()
상의 Query
객체 다음 수 정상적인 SQL을 사용하여 항상 되돌리기 다시.
setMaxResults를 사용하지 않으려면 list 대신 Query.scroll을 사용하여 원하는 행을 가져올 수 있습니다. 예를 들어 페이징에 유용합니다.
String hql = "select userName from AccountInfo order by points desc 5";
이것은 사용하지 않고 나를 위해 일했습니다. setmaxResults();
keyword를 사용하지 않고 마지막 값 (이 경우 5)에 최대 값을 제공하십시오 limit
. :피
내 관찰에 따르면 HQL (최대 절전 모드 3.x)에 제한이있어 구문 분석 오류가 발생하거나 무시됩니다. (한계 전에 + desc / asc로 주문한 경우 무시됩니다. 한도 전에 desc / asc가 없으면 파싱 오류가 발생합니다)
이 모드에서 한도를 관리 할 수있는 경우
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();
}
이것은 제한 또는 목록을 처리하는 정말 간단한 코드입니다.
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());
}
네이티브 쿼리를 작성해야합니다 ( 이 참조) .
@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);
@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);
이를 위해 페이지 매김을 쉽게 사용할 수 있습니다.
@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)
레코드를 가져오고 목록에서 첫 번째 레코드 를 가져 오려면 전달해야 합니다 .
참고 URL : https://stackoverflow.com/questions/1239723/how-do-you-do-a-limit-query-in-hql
'IT story' 카테고리의 다른 글
PowerShell을 사용한 재귀 파일 검색 (0) | 2020.04.21 |
---|---|
Windows 배치 파일을 사용하여 텍스트 파일의 각 줄을 어떻게 반복합니까? (0) | 2020.04.21 |
HTML을 회전시키는 방법 (0) | 2020.04.21 |
비동기 / 대기 구문에서 거부하는 방법? (0) | 2020.04.20 |
자바 스크립트 차트 라이브러리 (0) | 2020.04.20 |