IT story

HQL에서 제한 쿼리를 어떻게 수행합니까?

hot-time 2020. 4. 21. 08:21
반응형

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

반응형