development

제한을 사용하는 JPA 2 CriteriaQuery

big-blog 2021. 1. 5. 21:06
반응형

제한을 사용하는 JPA 2 CriteriaQuery


저는 JPA 2를 사용하고 있습니다. 안전상의 이유로 CriteriaQuery를 사용하여 안전한 형식으로 작업하고 있습니다 (따라서 형식화 된 쿼리에 대한 솔루션을 검색하지 않습니다).

최근에 SQL-LIMIT를 설정해야하는 문제를 발견했습니다.

많은 검색 후에도 여전히 해결책을 찾지 못했습니다.

CriteriaQuery<Product> query = getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root<Product> product = query.from(Product.class);
query.select(product);

return em.createQuery(query).getResultList();

누구든지 나를 도울 수 있습니까?


쿼리 에 대한 제한오프셋 정의 :

return em.createQuery(query)
         .setFirstResult(offset) // offset
         .setMaxResults(limit) // limit
         .getResultList();

문서에서 :

TypedQuery setFirstResult (int startPosition)

검색 할 첫 번째 결과의 위치를 ​​설정합니다. 매개 변수 : startPosition -0부터 번호가 매겨진 첫 번째 결과의 위치

TypedQuery setMaxResults (int maxResult)

검색 할 최대 결과 수를 설정합니다.


완전성을 위해 JPA Criteria API와 관련된 초기 질문에 답하고 싶습니다.

우선 , 사용 사례에 따라 JPQL을 사용할시기와 Criteria API를 사용할시기를 미리 스스로 명확히 할 수 있습니다. ObjectDB 문서 웹 사이트 에 다음과 같은 멋진 기사 가 있습니다.

기준 API 사용의 주요 이점은 런타임이 아닌 컴파일 중에 오류를 더 일찍 감지 할 수 있다는 것입니다. 반면에 많은 개발자에게 SQL 쿼리와 매우 유사한 문자열 기반 JPQL 쿼리는 사용하고 이해하기가 더 쉽습니다.

이 기사는 JPA Criteria API를 사용하는 방법을 간결하게 설명하기 때문에 일반적으로 권장합니다. Query API 에 대한 유사한 기사가 있습니다.

질문으로 돌아 가기 :

A CriteriaQuerywhere()메서드 를 사용하여 액세스 할 수있는 제한 집합을 제공합니다 . 직관적으로 짐작할 수 있듯이, 이러한 제한이있는 특정 수의 결과로 쿼리를 제한 할 수는 없습니다. 단, 고유 식별자 제한 (기준 API 사용을 쓸모 없게 만드는)과 같은 사소한 경우를 제외하고는 쿼리를 제한 할 수 없습니다. 간단히 설명 : 제한은 기준이 아니므로 해당 API에 포함되지 않습니다. 자세한 내용은 오래되었지만 금색 인 Java EE 문서 를 참조하십시오.

해결책

그러나 물론 CriteriaQuery 객체를 JPQL 쿼리의 기초로 사용할 수 있습니다. 따라서 먼저 CriteriaQuery를있는 그대로 만듭니다.

CriteriaQuery<Product> criteriaQuery = 
    getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root<Product> product = criteriaQuery.from(Product.class);
criteriaQuery.select(product);

그런 다음 객체에 JPA Query생성자를 사용 CriteriaQuery합니다.

Query limitedCriteriaQuery = getEntityManager().createQuery(criteriaQuery)
     .setMaxResults(resultLimit); // this is the important part     
return limitedCriteriaQuery.getResultList();

그리고 그것은 기본적으로 문서와 제공된 기사에 따라 두 API를 모두 사용해야하는 방법입니다.

참조 URL : https://stackoverflow.com/questions/11655870/jpa-2-criteriaquery-using-a-limit

반응형