[java] JPA 및 최대 절전 모드-기준 대 JPQL 또는 HQL

Criteria 또는 HQL 사용의 장단점은 무엇입니까 ? Criteria API는 Hibernate에서 쿼리를 표현하는 훌륭한 객체 지향 방법이지만, 때로는 Criteria Queries가 HQL보다 이해 / 빌드하기가 더 어렵습니다.

언제 기준을 사용하고 언제 HQL을 사용합니까? 어떤 사용 사례에서 무엇을 선호합니까? 아니면 맛의 문제일까요?



답변

나는 주로 동적 쿼리에 대한 기준 쿼리를 선호합니다. 예를 들어, 일부 매개 변수에 따라 일부 순서를 동적으로 추가하거나 일부 부품 (예 : 제한 사항)을 제외하는 것이 훨씬 쉽습니다.

반면에 HQL을 이해하고 읽기가 훨씬 쉽기 때문에 정적 쿼리와 복잡한 쿼리에 HQL을 사용하고 있습니다. 또한 HQL은 조금 더 강력합니다. 예를 들어 다른 조인 유형에 적합합니다.


답변

HQL과 criteriaQuery간에 성능면에서 차이가 있습니다. criteriaQuery를 사용하여 쿼리를 실행할 때마다 테이블 이름에 대한 새 별칭이 생성되어 DB의 마지막 쿼리 캐시에 반영되지 않습니다. 이로 인해 생성 된 SQL을 컴파일하는 데 오버 헤드가 발생하여 실행 시간이 더 걸립니다.

가져 오기 전략에 관하여 [http://www.hibernate.org/315.html]

  • 기준은 매핑의 게으름 설정을 존중하며로드하려는 항목이로드되도록 보장합니다. 이는 하나의 기준 쿼리로 인해 지연되지 않은 모든 맵핑 된 연관 및 콜렉션이있는 서브 그래프를 페치하기 위해 여러 개의 SQL 즉시 SELECT 문이 발생할 수 있음을 의미합니다. “how”및 “what”을 변경하려면 setFetchMode ()를 사용하여 특정 콜렉션 또는 연관에 대한 외부 조인 페치를 활성화하거나 비활성화하십시오. 기준 쿼리는 페치 전략 (join vs select vs subselect)도 완전히 존중합니다.
  • HQL은 매핑의 게으름 설정을 존중하며로드하려는 항목이로드되도록합니다. 이는 하나의 HQL 쿼리로 인해 지연되지 않은 모든 맵핑 된 연관 및 콜렉션이있는 서브 그래프를 페치하기 위해 여러 개의 SQL 즉시 SELECT 문이 발생할 수 있음을 의미합니다. “how”및 “what”을 변경하려면 LEFT JOIN FETCH를 사용하여 특정 콜렉션 또는 널 입력 가능 다 대일 또는 일대일 연관에 대해 외부 조인 페치를 사용하거나 JOIN FETCH를 사용으로 설정하십시오. 널이 불가능한 다 대일 또는 일대일 연관을위한 내부 결합 페치. HQL 쿼리는 매핑 문서에 정의 된 fetch = “join”을 존중하지 않습니다.

답변

기준은 객체 지향 API이며 HQL은 문자열 연결을 의미합니다. 즉, 객체 지향의 모든 이점이 적용됩니다.

  1. 다른 모든 것이 동일하다면 OO 버전은 다소 오류가 덜 발생합니다. 기존 문자열은 HQL 쿼리에 추가 될 수 있지만 유효한 Criteria 개체 만 Criteria 트리로 만들 수 있습니다. 효과적으로 Criteria 클래스가 더 제한적입니다.
  2. 자동 완성 기능을 사용하면 OO를 더 쉽게 검색 할 수 있습니다 (적어도 사용하기 더 쉽습니다). 쿼리의 어느 부분이 어디로 갔는지 기억할 필요는 없습니다. IDE가 당신을 도울 수 있습니다
  3. 또한 구문의 특정 내용 (기호가 어디로 이동하는지 등)을 기억하지 않아도됩니다. 메소드를 호출하고 객체를 생성하는 방법 만 알면됩니다.

HQL은 SQL과 매우 유사하기 때문에 (대부분의 개발자는 이미 잘 알고 있음) 이러한 “기억할 필요가 없습니다”라는 주장은 그다지 중요하지 않습니다. HQL이 더 다르다면 더 중요 할 것입니다.


답변

일반적으로 입력이 어떤 데이터에 사용 될지 알지 못하는 경우 기준을 사용합니다. 사용자가 1에서 50 개 항목 중 하나를 입력 할 수있는 검색 양식과 마찬가지로 검색 대상을 숨 깁니다. 사용자가 무엇을 검색하는지 확인하는 동안 기준에 더 많은 것을 추가하는 것은 매우 쉽습니다. 그 상황에서 HQL 쿼리를 넣는 것이 조금 더 번거로울 것이라고 생각합니다. HQL은 내가 원하는 것을 정확히 알면 훌륭합니다.


답변

HQL은 훨씬 쉽게 읽고, Eclipse Hibernate 플러그인과 같은 도구를 사용하여 디버깅하고, 로그하기가 더 쉽습니다. 조건 쿼리는 런타임에 많은 동작이 결정되는 동적 쿼리를 작성하는 데 더 좋습니다. SQL을 모른다면 Criteria 쿼리 사용을 이해할 수 있지만 전반적으로 내가 원하는 것을 알고 있으면 HQL을 선호합니다.


답변

기준은 두 번째 수준 쿼리 캐시의 특수 최적화를 활용하는 자연 키 조회를 지정하는 유일한 방법입니다. HQL은 필요한 힌트를 지정할 방법이 없습니다.

여기에서 더 많은 정보를 찾을 수 있습니다.


답변

기준 Api는 최대 절전 모드의 좋은 개념 중 하나입니다. 내 관점에 따르면 이것들은 HQLCriteria Api를 변화시킬 수있는 몇 가지 요점입니다.

  1. HQL은 데이터에 대해 선택 및 비 선택 작업을 모두 수행하지만 기준은 데이터를 선택하기위한 것이며 기준을 사용하여 비 선택 작업을 수행 할 수 없습니다.
  2. HQL은 정적 쿼리 실행에 적합하며, 기준이 동적 쿼리 실행에 적합합니다.
  3. HQL은 페이지 매김 개념을 지원하지 않지만 Criteria로 페이지 매김을 달성 할 수 있습니다.
  4. HQL보다 실행하는 데 더 많은 시간이 소요되었습니다.
  5. Criteria를 사용하면 동적 쿼리 생성으로 인해 SQL 인젝션에 안전 하지만 쿼리가 고정되거나 매개 변수화되어 HQL에서는 SQL 인젝션으로부터 안전하지 않습니다