2017-11-29 32 views
2

허용되지와 절 나는이 같은 JPA 저장소 및 JPQL 쿼리가 있습니다JPQL 쿼리 - 최대 절전 모드 : 가져온 협회

@Query("SELECT c from Campaign c" + 
     " left join fetch c.postsList p on p.status = :postStatus" + 
     " left join fetch p.platform" + 
     " left join fetch c.campaignStatistics stat on stat.updateDate = :updateDate" + 
     " where c.id =:id") 
Campaign findCampaignWithPosts(
     @Param("id") Long id, 
     @Param("postStatus") PostStatus postStatus, 
     @Param("updateDate") LocalDate updateDate); 

을하지만 '작업 아무튼. 내가 얻을 :

org.hibernate.hql.internal.ast.QuerySyntaxException: with-clause not allowed on fetched associations; use filters 

본인은 JPA 2.1 스펙에 대한 정보를 공부 가서 그게 내가 무엇을 발견 : 조인을 사용

조인 조건은 매핑의 가입 열에서 비롯됩니다. 즉, JPQL 사용자는 일반적으로 모든 관계가 결합 된 방법을 알고 을 알 필요가 없습니다. 경우에 따라 외부 조건의 경우 일반적으로 의 조인 조건에 추가 조건을 추가하는 것이 바람직합니다 ( ). 이것은 ON 절을 통해 수행 할 수 있습니다. ON 절은 JPA 2.1 규격에 정의되어 있으며 일부 JPA 공급자가 지원할 수 있습니다. EclipseLink : Hibernate : TopLink - ON 절을 지원합니다.

이 쿼리에 가끔 내가 널 얻을 렸기 때문에 절 사용 후 테이블을 조인하는 경우 이러한 유형의 쿼리가, 날 전혀 도움이되지 않는다는 점에 유의해야한다

.

@Query("SELECT c from Campaign c" + 
      " left join fetch c.postsList p" + 
      " left join fetch p.platform" + 
      " left join fetch c.campaignStatistics stat" + 
      " where c.id =:id" + 
      " and p.status = :postStatus" + 
      " and stat.updateDate = :updateDate") 

이 경우 어떻게해야합니까? 네이티브 쿼리를 사용하는 방법 이외의 대안 솔루션이 있습니까? 그러나 거의 모든 JPQL 쿼리의 의미는 손실됩니다. 최대 절전 모드 버전 5.2.12를 사용합니다.

+0

당신이 확인 했

는 시도인가? –

+0

@Luiggi Mendoza 아니요, 클래스의 모든 필드에 'with'가 포함되어 있지 않습니다. – Birthright

+0

아마도 FETCH JOIN을 사용할 때 'ON' 절을 사용할 수 없다는 뜻입니까? 그렇다면 JPA 사양도 마찬가지입니다. 정말 놀랍습니까? 'ON'은 일반적인'JOIN'에서만 허용됩니다. – DN1

답변

1

당신이 추가 할 때 p.status = : postStatus가 맞으면 조인의 오른쪽이없는 (즉, 캠페인에 게시물이 없을 때) 결과가 걸러집니다. .

나를 위해 일한 것은 OR 절을 추가하여 조인의 오른쪽이 NULL 인 경우를 허용하는 것입니다.

따라서 and p.status = :postStatusand (p IS NULL OR p.status = :postStatus)으로 대체해야합니다.

그래서이 요청이 작동해야합니다

받은 오류 메시지에 대해서는
@Query("SELECT c from Campaign c" + 
      " left join fetch c.postsList p" + 
      " left join fetch p.platform" + 
      " left join fetch c.campaignStatistics stat" + 
      " where c.id =:id" + 
      " and (p is NULL OR p.status = :postStatus)" + 
      " and stat.updateDate = :updateDate") 

, 나는 그 이미 JPA/Hibernate에 의해 처리되기 때문에 당신이 ON 절을 추가하지한다고 생각합니다.

나는 최대 절전 모드 5.0.12를 사용하고있다.

+0

''좋은 생각이 아닙니다 '(https://stackoverflow.com/a/5819631/2387977)'fetch' 별칭에'WHERE' 조건을 사용합니다. – Dherik

0

그것은에 조건을 별칭 가져 not a good idea 사용은 수업에 일부 필드는`with`를 호출하는 경우이

@Query("SELECT c from Campaign c" + 
     " left join c.postsList p" + 
     " left join fetch c.postsList " + 
     " left join fetch p.platform " + 
     " left join c.campaignStatistics stat" + 
     " left join fetch c.campaignStatistics " + 
     " where c.id =:id" + 
     " and (p is NULL OR p.status = :postStatus)" + 
     " and stat.updateDate = :updateDate")