2012-09-23 2 views
0

그래서 세 개의 모델이 있습니다. Crag에는 하나 이상의 CragLocations가 있고 각 CragLocation에는 Location이 있습니다.JPA2 JPQL에 대한 critieria 쿼리를 선호합니까?

public List<Crag> getCragsWithGridRef() { 
     /** 
     * we want to query select c.* from crag c join CragLocation cl on c.id 
     * = cl.cragId join Location l on cl.locationId = l.id where 
     * len(l.gridReference)>1 
     */ 
     TypedQuery<Crag> query = 
       em.createQuery(
         "SELECT c FROM Crag c JOIN c.CragLocations cl JOIN cl.location l where LENGTH(l.gridReference) > 1", 
         Crag.class); 
     return query.getResultList(); 
    } 

두뇌가 기준 쿼리를 처리 할 수 ​​없기 때문에 주로 이렇게 쿼리합니다. 나는 그 (것)들을 볼 때 의미를 해석하기 위하여 고투한다.

기준 쿼리를 선호하는 성능이나 유지 관리 가능성 (또는 다른 이유로)이 있습니까? 그렇다면이 쿼리를 어떻게 표현 하시겠습니까?

답변

3

아니요, 특히 JPQL 쿼리를 이해하기 쉽고 유지 관리하기 쉽고, 조건 쿼리를 이해하고 유지하기가 어렵다고 생각하면 (나는 동의합니다) JPQL 쿼리보다 조건 쿼리를 선호 할 이유가 없습니다.

기준 쿼리는 자동 생성 메타 모델을 사용하는 경우 작성하기가 어렵지만 한 번 작성하면 구문 오류가없는 것으로 확신 할 수 있습니다. 그렇다고해서 쿼리가 수행해야하는 작업을 수행하지는 않습니다. 따라서 어떤 경우 든 쿼리를 단위 테스트해야합니다. 단위 테스트에서 쿼리를 다루는 경우 가장 잘 읽고 유지 관리 할 수있는 것을 사용하십시오. 기본 SQL 쿼리를 생성하는 성능 차이가 있더라도이 차이는 실제로 쿼리를 실행하는 비용에 비해 무시할 수 있습니다.

나는 (심지어 항상 등) 기준 만이 상황에서 쿼리를 사용 :

  1. 쿼리가 동적으로 선택 검색 기준의 세트에서 구성되어
  2. 공통 부분을 공유하는 많은 유사한 쿼리가 있습니다
  3. , 나는 각각의 모든 쿼리에서이 공통 부분을 반복하지 않기를 바랍니다. 기준을 사용하면 공통 부분을 재사용 가능한 방법으로 배치 할 수 있습니다.
+0

한 가지 더. Criteria 쿼리를 작성하면 종종 생성 된 속편이 결코 생각하지 못했던 무언가가 될 것이라는 것을 알게 될 것입니다.하지만 작동합니다. 그거 꽤 멋지다. – carbontax

관련 문제