2014-09-19 76 views
0

這是我的方法:Java的JPA CriteriaBuilder或表達不正常工作

CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<EmployersList> criteriaQuery = builder.createQuery(EmployersList.class); 
Root<EmployersList> root = criteriaQuery.from(EmployersList.class); 

Expression<String> orgPhoneNumberExp = root.get("orgphoneNumber"); 
Predicate orgPhoneNumberPredicate = orgPhoneNumberExp.in(phoneNumber); 

Expression<String> accPhoneNumberExp = root.get("accphoneNumber"); 
Predicate accPhoneNumberPredicate = accPhoneNumberExp.in(phoneNumber); 

Expression<String> orgStatusExp = root.get("orgphoneStatus"); 
Predicate orgStatusExpPredicate = builder.upper(orgStatusExp).in("SUSPECT", "FRAUD", "NEGATIVE"); 

Expression<String> accPhoneStatusExp = root.get("accphoneStatus"); 
Predicate accPhoneStatuPredicate = builder.upper(accPhoneStatusExp).in("SUSPECT", "FRAUD", "NEGATIVE"); 

Expression<Date> orgPhoneStatusExpDateExmp = root.get("orgphoneStatusExpdate"); 

Expression<Date> accPhoneStatusExpDateExmp = root.get("accphoneStatusExpdate"); 

Predicate orgPhoneStatusExpDatePredicate = builder.or(builder.greaterThanOrEqualTo(orgPhoneStatusExpDateExmp, new Date()), builder.isNull(orgPhoneStatusExpDateExmp)); 

Predicate accPhoneStatusExpDatePredicate = builder.or(builder.greaterThanOrEqualTo(accPhoneStatusExpDateExmp, new Date()), builder.isNull(accPhoneStatusExpDateExmp)); 

Expression<Boolean> orgExp = builder.and(orgPhoneNumberPredicate, builder.and(orgStatusExpPredicate, orgPhoneStatusExpDatePredicate)).as(Boolean.class); 

Expression<Boolean> accExp = builder.and(accPhoneNumberPredicate, builder.and(accPhoneStatuPredicate, accPhoneStatusExpDatePredicate)).as(Boolean.class); 

criteriaQuery.where(builder.or(orgExp, accExp)); 

List<EmployersList> result = entityManager.createQuery(criteriaQuery).getResultList(); 

所以,我需要檢查「組織」電話和DB「ACC」手機。我需要檢查...(如果orgphoneNumber IN(我將得到的方法參數中的電話號碼列表),如果orgStatusExp - SUSPECT或FRAUD或NEGATIVE和orgPhoneStatusExpDateExmp> = curdate或null)否則...我需要檢查相同的東西對於「ACC」手機

與此代碼我與這​​裏選擇:

where 
    (
     employersl0_.ORGPHONE_NUMBER in (
      ? 
     ) 
    ) 
    and (
     upper(employersl0_.ORGPHONE_STATUS) in (
      ? , ? , ? 
     ) 
    ) 
    and (
     employersl0_.ORGPHONE_STATUS_EXPDATE>=? 
     or employersl0_.ORGPHONE_STATUS_EXPDATE is null 
    ) 
    or (
     employersl0_.ACCPHONE_NUMBER in (
      ? 
     ) 
    ) 
    and (
     upper(employersl0_.ACCPHONE_STATUS) in (
      ? , ? , ? 
     ) 
    ) 
    and (
     employersl0_.ACCPHONE_STATUS_EXPDATE>=? 
     or employersl0_.ACCPHONE_STATUS_EXPDATE is null 
    ) 

,但我想是這樣的:

where 
    (
     employersl0_.ORGPHONE_NUMBER in (
      ? 
     ) 
     and (
       upper(employersl0_.ORGPHONE_STATUS) in (
       ? , ? , ? 
       ) 
      ) 
     and (
      employersl0_.ORGPHONE_STATUS_EXPDATE>=? 
      or employersl0_.ORGPHONE_STATUS_EXPDATE is null 
     ) 
    ) 

    or (
     employersl0_.ACCPHONE_NUMBER in (
      ? 
     ) 
     and (
      upper(employersl0_.ACCPHONE_STATUS) in (
       ? , ? , ? 
      ) 
     ) 
     and (
      employersl0_.ACCPHONE_STATUS_EXPDATE>=? 
      or employersl0_.ACCPHONE_STATUS_EXPDATE is null 
     ) 
    ) 

你能幫我這個問題?: )

回答

0

對於這種情況你最定義3謂詞。
pridicate a do和ORGPHONE_NUMBER,ORGPHONE_STATUS和ORGPHONE_STATUS_EXPDATE。
pridicate b do ACCPHONE_NUMBER,ACCPHONE_STATUS和ACCPHONE_STATUS_EXPDATE。
pridicate c do或on pridcate a和b。

+0

沒有改變... – user2870934 2014-09-22 06:20:59