2013-08-14 3 views
0

다음 값을 Subject 속성에 대해 평가하는 데 다음 Criteria API 쿼리를 사용했습니다.조건 API 조건부로 'NULL'을 계산하십시오.

SELECT t1.UID AS a1, t1.EMAIL AS a2, t1.PASSWORD AS a3, t1.VERSION AS a4, t1.COMPANY_ID AS a5, t1.METIER_ID AS a6, t1.ACCOUNT_ID AS a7, t1.CONTACT_ID AS a8 FROM METIER t3, COMPANY t2, SUBJECT t1, CONTACT t0 WHERE (((((t1.EMAIL LIKE ? OR t0.FIRSTNAME LIKE ?) OR t0.LASTNAME LIKE ?) OR t3.NAME LIKE ?) OR (t2.NAME LIKE ? IS NOT NULL)) AND (((t0.ID = t1.CONTACT_ID) AND (t3.ID = t1.METIER_ID)) AND (t2.ID = t1.COMPANY_ID))) LIMIT ?, ? 

오전 데 문제가 Subject_.companynull이 될 수 있다는 것입니다 :

... 
    Expression literal = builder.literal((String) "%" + filterValue + "%"); 

    // When the globalFilter is deleted it returns "" 
    if (!"".equals(filterValue)) { 
     // JPQL equivilant: SELECT e FROM Subject e JOIN e.company c JOIN e.contact ct WHERE c.name LIKE :literal OR ct.firstName LIKE :literal ... etc 
     List<Predicate> globalPredicate = new ArrayList<>(); 

     globalPredicate.add(builder.like(subject.get(Subject_.email), literal)); 
     globalPredicate.add(builder.like(subject.join(Subject_.contact).get(Contact_.firstName), literal)); 
     globalPredicate.add(builder.like(subject.join(Subject_.contact).get(Contact_.lastName), literal)); 
     globalPredicate.add(builder.like(subject.join(Subject_.metier).get(Metier_.name), literal)); 
     globalPredicate.add(builder.like(subject.join(Subject_.company).get(Company_.name), literal)); 

     predicates.add(builder.or(globalPredicate.toArray(new Predicate[globalPredicate.size()]))); 
    } 
... 

이 다음 쿼리를 만듭니다. 이 쿼리는 Subject_.companynull으로 설정된 모든 항목을 효과적으로 무시합니다.

어떻게 든이 쿼리를 수정하여 null 값이 자동으로 삭제되지 않도록해야합니다.

답변

2

JoinType 매개 변수를 사용하는 조인 방법을 사용해야하며 JoinType.LEFT를 지정하여 기본값 대신 왼쪽 외부 조인을 사용하도록 지정해야합니다.

왼쪽 외부 조인은 제목 -> 회사 관계가 null 회사의 결과를 필터링하지 못하도록합니다.

+0

크리스 감사합니다. 완벽하게 작동합니다. – tarka

관련 문제