2011-02-18 4 views
1

JPA 2 쿼리를 사용하면 문제가 생길 수 있습니다. SurveyQuestion에는 조직이있을 수 있습니다. 다음은 SurveyQuestion 내의 매핑입니다.OR 절에 이상한 동작을하는 JPA 2 쿼리

@ManyToOne(optional=true) 
@JoinColumn(name="organization_key") 
private Organization organization; 

조직에 key라는 필드가 있습니다. 나는 단지 주어진 키를 가지고 질문을받을 해당 쿼리 다음과 같은 JPQL

SELECT q from SurveyQuestion q 
    where q.organization IS NULL 
    or q.organization.key = :organizationKey 

와 TypedNamedQuery을 만들 수 있습니다. 쿼리에서 q.organization.key = : organizationKey를 제거하면 조직이없는 모든 항목을 가져 오지만 실제로는 조직이 없거나 갖고 있지 않은 항목의 조합을 반환 할 수 없습니다. 주어진 조직.

JPA2와 EclipseLink 공급자.

+0

이 문제가 발생할 수 있습니까? http://wiki.eclipse.org/EclipseLink/Development/JPA_2.0/jpql#Feature_design –

+0

hrm, 아마도 IS NULL 자격을 제거하면 주어진 조직의 질문을 모두 얻을 수 있습니다. 나는 둘 다 동시에 조합을 얻을 수 없다. – digitaljoel

답변

3

이것은 JPA 표준입니다.

q.organization.key 

은 왼쪽 조인이 아닌 q.organization의 내부 조인으로 결정됩니다!

당신이해야 할

:`KEY`가 JPA2의 키워드이기 때문에

SELECT q 
    from SurveyQuestion q 
    left join q.organization o 
where o is null OR o.key = :organizationKey 
+0

다니엘 감사합니다. 이것이 내가 훌륭한 JPA 책을 친구에게 빌려주는 이유입니다. 마찬가지로 귀하의 쿼리는 "q.organization이 null 인"이유로 인해 동일한 동작을합니다. "o가 null입니다"로 변경해야합니다. 그렇지 않으면 Where 절의 q.organization이 광산. 즉, 귀하의 제안으로 인해 오늘 아침 10 분 안에 해결되었습니다. 다시 한번 감사드립니다. – digitaljoel

+0

내 코드에서 수정했습니다. 천만에요. – Daniel