2017-11-28 12 views
0

を使用して述語私はJPQLを使用して選択クエリをしたいが、私は自分のコードに間違いがあり、 はここにコード「または」述語の内側「と」JPQL

private CriteriaQuery<TbCase> getQueryParams(TbCaseSearchParams params, CriteriaBuilder cb, CriteriaQuery<TbCase> cq,Root<TbCase> root){ 

    List<Predicate> criteria = new ArrayList<Predicate>(); 

    if(params.getEqColumns() != null && params.getEqValues() != null){ 
     criteria = getEqParamsCriteria(criteria, cb, root, params.getEqColumns(), params.getEqValues()); 
    }else if(params.getLikeColumns() != null && params.getLikeValues() != null){ 
     criteria = getLikeParamsCriteria(criteria, cb, root, params.getLikeColumns(), params.getLikeValues()); 
    }else{ 

     if(params.getCaseNumber() != null){ 
      criteria.add(cb.equal(root.get("caseNumber"), params.getCaseNumber())); 
     } 

     if(params.getCaseStatusIds() != null){ 
      List<String> caseStatusIds = new ArrayList<String>(); 
      caseStatusIds = params.getCaseStatusIds(); 
      for(int i=0 ; i<caseStatusIds.size() ; i++){ 
       criteria.add(cb.or(cb.equal(root.get("caseStatusByCaseStatusId"), Integer.valueOf(params.getCaseStatusIds().get(i))))); 
      } 
     } 
    } 

    cq.select(root).where(cb.and(criteria.toArray(new Predicate[0]))); 

    return cq; 
} 

これは、SQLでクエリの結果でありますフォーム

select something from TABLENAME as something where (something.caseNumber=:param0) and (something.caseStatusByCaseStatusId=1) and (something.caseStatusByCaseStatusId=-1) and (something.caseStatusByCaseStatusId=1) and (something.caseStatusByCaseStatusId=9) and (something.caseStatusByCaseStatusId=4) and (something.caseStatusByCaseStatusId=5) and (something.caseStatusByCaseStatusId=10) and (something.caseStatusByCaseStatusId=2) order by something.caseNumber desc 

と予想されるクエリは、exを持っている私のコードをどうするか、この

select something from TABLENAME as something where (something.caseNumber=:param0) and (something.caseStatusByCaseStatusId=1 or something.caseStatusByCaseStatusId=-1 or something.caseStatusByCaseStatusId=1 or something.caseStatusByCaseStatusId=9 or something.caseStatusByCaseStatusId=4 or something.caseStatusByCaseStatusId=5 or something.caseStatusByCaseStatusId=10 or something.caseStatusByCaseStatusId=2) order by something.someCriteria desc 

のようなものですあなたは別の詳細が必要な場合、私はすぐに更新されます。

答えて

0

私は以下のスニペットを自分でテストしていません。あなたはgetEqParamsCriteria()getLikeParamsCriteria()にコードを適応させる必要があり

Predicate andCriteria = cb.conjunction(); 

if (params.getEqColumns() != null && params.getEqValues() != null) { 
    andCriteria = cb.and(andCriteria, cb.equal(...); 
    // ... furhter andCriteria 
} else if (params.getLikeColumns() != null && params.getLikeValues() != null) { 
    andCriteria = cb.and(andCriteria, cb.like(...); 
    // ... furhter andCriteria 
} else { 
    if(params.getCaseNumber() != null){ 
     andCriteria = cb.and(andCriteria, cb.equal(root.get("caseNumber"), params.getCaseNumber())); 
    } 
    if (params.getCaseStatusIds() != null) { 
     List<String> caseStatusIds = new ArrayList<String>(); 
     caseStatusIds = params.getCaseStatusIds(); 
     Predicate orCriteria = cb.disjunction(); 
     for (int i=0 ; i < caseStatusIds.size() ; i++) { 
      orCriteria = cb.or(orCriteria, cb.equal(root.get("caseStatusByCaseStatusId"), Integer.valueOf(params.getCaseStatusIds().get(i)))); 
     } 
     andCriteria = cb.and(andCriteria, orCriteria); 
    } 
} 

cq.select(root).where(andCriteria); 

注:しかし、それは基準のクエリを作成する方法方法でなければなりません。