문제

What are the pros and cons of using 조회?기준 API 은 객체지향적 방법을 익스프레스 쿼리에는 최대 절전 모드지만,때로는 기준을 쿼리가 더 이해하기 어려운/빌보 조회.

때 당신은 기준을 사용하고 때 조회?당신은 무엇을 선호하는 사용 사례는?또는 그것의 문제 맛?

도움이 되었습니까?

해결책

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

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

다른 팁

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

가져 오는 전략에 관해 http://www.hibernate.org/315.html

  • 기준은 매핑의 게으름 설정을 존중하고로드하려는 것을로드하는 것을 보장합니다. 이는 하나의 기준 쿼리로 인해 여러 SQL 즉시 선택 명령문이 생길 수 있음을 의미합니다. "방법"과 "What"를 변경하려면 SetfetchMode ()를 사용하여 특정 컬렉션 또는 연관에 대한 외부 조인 페치를 활성화 또는 비활성화하십시오. 기준 쿼리는 또한 페치 전략을 완전히 존중합니다 (join vs select vs subselect).
  • HQL은 매핑의 게으름 설정을 존중하고로드하려는 것을로드하는 것을 보장합니다. 이는 하나의 HQL 쿼리가 여러 SQL 즉시 선택 명세서를 초래할 수 있음을 의미합니다. "방법"과 "What"조차 변경하려면 왼쪽 결합 Fetch를 사용하여 특정 컬렉션 또는 무효가 가능한 다중 또는 일대일 협회에 대한 외부 결합 페치를 가능하게하거나 Fetch에 가입하여 활성화하십시오. 무효화 할 수없는 다중 또는 일대일 협회에 대한 내부 조인 페치. HQL 쿼리는 매핑 문서에 정의 된 페치 = "조인"을 존중하지 않습니다.

기준은 객체 지향 API이고 HQL은 문자열 연결을 의미합니다. 즉, 객체 지향성의 모든 이점이 다음과 같습니다.

  1. 다른 모든 것이 동일하기 때문에 OO 버전은 오류가 발생하기 쉬운 다소 덜합니다. 모든 오래된 문자열은 HQL 쿼리에 추가 될 수 있지만 유효한 기준 객체 만 기준 트리로 만들 수 있습니다. 효과적으로 기준 클래스가 더 제한적입니다.
  2. 자동 완성을 사용하면 OO가 더 발견 가능합니다 (따라서 적어도 나에게는 사용하기가 더 쉽습니다). 쿼리의 어느 부분이 어디로 가는지 기억할 필요는 없습니다. IDE가 당신을 도울 수 있습니다
  3. 또한 구문의 세부 사항을 기억할 필요는 없습니다 (어떤 기호가 어디로 가는지). 알아야 할 것은 메소드를 호출하고 객체를 만드는 방법 만 있으면됩니다.

HQL은 SQL과 매우 흡사하기 때문에 (대부분의 개발자는 이미 잘 알고 있습니다), 이러한 "기억할 필요가 없다"고 인수는 무게가 많지 않습니다. HQL이 더 다르면 더 중요한 것은 더 중요합니다.

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

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

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

여기에서는 몇 가지 정보를 찾을 수 있습니다.

기준 API는 최대 절전 모드의 좋은 개념 중 하나입니다. 내 견해에 따르면 이것이 우리가 차이를 만들 수있는 몇 가지 지점입니다. HQL 그리고 기준 API

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

나를 위해 기준은 이해하기 쉽고 동적 쿼리를 만드는 매우 쉽습니다. 그러나 내가 지금까지 말한 결함은 우리가 세 가지 유형의 페치 모드 (즉, 선택, 프록시 및 기본값이 있기 때문에 많은 일대일 등 관계를로드한다는 것입니다. me out :))

기준의 두 번째 문제는 완전한 객체를로드한다는 것입니다. 즉, 직원의 empname 만로드하려면이 일을 제시하지 않을 것입니다. 보고하는 데 정말로 효과가 있습니다. HQL로서로드 (연관성/관계를로드하지 않음)가 원하는 것을 여러 번 향상시킵니다.

기준의 한 가지 특징 중 하나는 동적 쿼리 생성으로 인해 SQL 주입으로부터 안전한 쿼리 생성으로부터 안전 해지는 것입니다.

또한 ASPX.CS 파일에 HQL을 작성하면 DAL과 밀접하게 결합됩니다.

전반적으로 내 결론은 보고서처럼 HQL없이 살 수없는 곳이 있으므로 다른 기준을 사용하는 것이 더 쉽게 관리한다는 것입니다.

두 세계의 최선을 사용하려면 HQL의 표현성과 간결함과 기준의 역동적 특성을 사용하려면 사용을 고려하십시오. querydsl.

QueryDsl은 JPA/Hibernate, JDO, SQL 및 컬렉션을 지원합니다.

나는 QueryDSL의 관리자 이므로이 답변은 편향되어 있습니다.

나를 위해 가장 큰 승리를 기준에 대한 예 API,당신이 통과할 수 있는 객체와 최대 절전 모드를 구축 할 것입 쿼리에 기반한 객체 속성입니다.

그 외에,이 기준을 API 의 단점(내가 믿는 최대 절전 모드 팀은 재작업은 api),다음과 같:

  • 기준.createAlias("obj")세력 안에 가입하는 대신 가능한 외부 조
  • 할 수 없습니다 만들기 같은 별칭을 두 시간
  • 몇 가지 sql 절 없는 간단한 기준의 대응(처럼 하위 select)
  • etc.

내가 사용하는 경향이 조회할 때 내가 원하는 쿼리와 비슷한 sql(에서 삭제 사용자 status='차단'),는 기준을 사용할 때 나는 원하지 않는다 사용할 문자열 추가.

의 또 다른 장점 조회가 정의할 수 있는 모든 질문하기 전에 손으로,심지어 externalise 들이 파일이나 그래서.

기준 API는 쿼리 필터가 런타임에 동적으로 적용될 때 동적으로 생성 된 쿼리에 더 적합합니다. 따라서 SQL 주입 공격을 방지합니다 동적 쿼리를 구축 할 때 Criteria API는 매우 좋은 선택입니다.

기준 쿼리는 표현력이 떨어지고 매우 복잡하고 비효율적으로 쉽게 끝날 수 있습니다. SQL 생성 쿼리. 한때 Criteria API가 기본 쿼리 방법 인 대규모 엔터프라이즈 애플리케이션에 가입했으며 광범위한 코드 검토조차도 우리가 어떤 SQL 쿼리를 끝낼 지 알지 못하는 공포를 극복 할 수 없었습니다.

JPQL 또는 HQL은 훨씬 표현력이 뛰어나며 관련 생성 된 SQL 쿼리를 예측하는 것이 훨씬 쉽습니다. 또한 기준보다 HQL 쿼리를 검토하는 것이 훨씬 쉽습니다.

대부분의 엔티티 쿼리 사용 사례는 클로시가 동적이 필요하지 않으므로 동적 기준에 대한 기준을 남기면서 JPQL을 사용하여 대부분의 쿼리를 구현할 수 있습니다.

JPQL 또는 Criteria API를 사용하여 엔티티를 선택하는 것이 수정 해야하는 경우에 합리적이라는 점은 주목할 가치가 있습니다. 그렇지 않으면 DTO 투영이 더 잘 수행됩니다. 체크 아웃 자세한 내용은이 기사입니다.

기준 API는 SQL 또는 HQL이 제공하지 않는 하나의 별개의 기능을 제공합니다. 즉. 쿼리를 컴파일 시간 점검 할 수 있습니다.

처음에는 응용 프로그램에서 주로 기준을 사용했지만 성능 문제로 인해 HQL로 대체 된 후에 기준을 사용했습니다.
주로 우리는 여러 조인이있는 매우 복잡한 쿼리를 사용하여 기준에서 여러 쿼리로 이어지지 만 HQL에서는 매우 최적화됩니다.
사례는 특정 객체에서 여러 가지 속성 만 사용하고 완전한 객체가 아니라는 것입니다. 기준으로 문제는 문자열 연결이었습니다.
HQL에서 사용자의 이름과 성을 표시해야한다고 가정 해 봅시다. (name || ' ' || surname) 그러나 Crteria에서는 이것이 불가능합니다.
이를 극복하기 위해 우리는 결과 전환기를 사용했는데, 여기서 필요한 결과를 위해 그러한 연결이 구현 된 방법이있었습니다.
오늘날 우리는 주로 다음과 같은 HQL을 사용합니다.

String hql = "select " +
            "c.uuid as uuid," +
            "c.name as name," +
            "c.objective as objective," +
            "c.startDate as startDate," +
            "c.endDate as endDate," +
            "c.description as description," +
            "s.status as status," +
            "t.type as type " +
            "from " + Campaign.class.getName() + " c " +
            "left join c.type t " +
            "left join c.status s";

Query query =  hibernateTemplate.getSessionFactory().getCurrentSession().getSession(EntityMode.MAP).createQuery(hql);
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return query.list();

따라서 우리의 경우 반환 된 레코드는 필요한 속성의지도입니다.

  • HQL은 데이터에 대한 선택 및 비 선택적 작업을 모두 수행하는 것이지만 기준은 데이터를 선택하는 것입니다. 기준을 사용하여 비 선택적 작업을 수행 할 수 없습니다.
  • HQL은 정적 쿼리를 실행하는 데 적합합니다.
  • HQL은 Pagination 개념을 지원하지 않지만 기준으로 페이지 매김을 달성 할 수 있습니다.
  • HQL을 실행하는 데 더 많은 시간이 걸리는 기준
  • 기준에 따라 동적 쿼리 생성으로 인해 SQL 주입으로 안전하지만 쿼리가 고정되거나 매개 변수화되므로 HQL에서는 SQL 주입으로부터 안전하지 않습니다.

원천

기준 쿼리 동적으로 입력을 기반으로 쿼리를 구성 할 수 있습니다. HQL 쿼리의 경우 정적 쿼리가 구성되면 쿼리 구조를 변경할 수 없습니다.

여기서 죽은 말을 차고 싶지는 않지만 기준 쿼리가 이제 더 이상 사용되지 않는다고 언급하는 것이 중요합니다. HQL을 사용하십시오.

또한 동적 쿼리의 기준 쿼리를 선호합니다. 그러나 삭제 쿼리에 대한 HQL을 선호합니다. 예를 들어 부모 ID 'XYZ'에 대한 자식 테이블에서 모든 레코드를 삭제하는 경우 HQL에서 쉽게 달성 할 수 있지만, 기준 API의 경우 N 수의 삭제 수를 삭제해야합니다. 테이블 레코드.

여기의 대부분의 답변은 오해의 소지가 있으며 언급합니다 Criteria Queries 보다 느립니다 HQL, 실제로는 그렇지 않습니다.

당신이 깊이 탐구하고 몇 가지 테스트를 수행하면 기준 쿼리는 일반 HQL보다 훨씬 더 잘 수행됩니다.

그리고 또한 기준 쿼리 당신은 얻습니다 객체 지향 제어 거기에 있지 않습니다 HQL.

자세한 내용은이 답변을 읽으십시오 여기.

다른 방법이 있습니다. 최대 절전 모드 원본 구문을 기반으로 HQL 파서를 만드는 것으로 끝났으므로 먼저 HQL을 구문 분석 한 다음 동적 매개 변수를 동적으로 주입하거나 HQL 쿼리에 대한 몇 가지 공통 필터를 자동으로 추가 할 수 있습니다. 잘 작동합니다!

이 게시물은 아주 오래 된다.대부분의 답변에 대해 이야기 Hibernate 기준,지 않은 JPA 기준입니다.JPA2.1 추가 CriteriaDelete/CriteriaUpdate 및 EntityGraph 제어하는 것을 정확하게 데이터베이스를 지원합니다.기준 API 은 더 나은 이후 자바 OO.그 이유는 JPA 이 만들어집니다.때 JPQL 이 컴파일된 번역될 것입하 AST 트리(OO 모델)기 전에 변환 SQL.

HQL은 유발할 수 있습니다 보안 SQL 주입과 같은 우려.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top