4

JPA 기준 쿼리 문제가 있습니다. 어떻게 여러 추가 할 수있는 다른 경우 내 기준 쿼리에서 절 ...JPA 조건 쿼리의 조건부 where 절

내 요구 사항은 다음과 같습니다

위의 코드에서
CriteriaBuilder builder = getEm().getCriteriaBuilder(); 
CriteriaQuery<Object> query = builder.createQuery(Object.class); 

// From 
Root<EntityClass> entity= query.from(EntityClass.class); 
// Select 
query.multiselect(entity.get("id").get("col1"),entity.get("id").get("col2")); 
// Where 
Predicate p1 = builder.and(builder.equal(entity.get("col3"), value3)); 
Predicate p2 = builder.and(builder.equal(entity.get("col4"), value4)); 
Predicate p3 = builder.and(builder.equal(entity.get("col5"), value5)); 
if(someCondition1){ 
    query.where(p1); 
}else if(someCondition2){ 
    query.where(p1); 
} 
query.where(p3); 

문 query.where (P3); 이전에 설정된 where 절 조건 p1과 p2를 대체합니다. 내가 찾은 대안은

if(someCondition1){ 
    query.where(p1, p3); 
}else if(someCondition2){ 
    query.where(p2, p3); 
}else{ 
    query.where(p3); 
} 

다음과 같은 결합한 것입니다 그러나 많은 경우 - 다른 사람이있을 때이 반복되는 코드를 작성하는 아주 나쁜되기 때문에 즉, 좋은 접근하지 무엇입니까. 아무도 이것에 대한 해결책을 가질 수 있습니까? 이 같은

답변

6

뭔가 : 단지 전체 표현을 구축하고 마지막에 어디 한 번 호출하는 경우

Predicate p; 
Predicate p3 = builder.equal(entity.get("col5"), value5); 
if(someCondition1){ 
    p = builder.equal(entity.get("col3"), value3); 
}else if(someCondition2){ 
    p = builder.equal(entity.get("col4"), value4); 
} 
if (p != null) p = builder.and(p, p3); 
else p = p3; 
query.where(p); 

그래서 모든에 호출하지 않습니다.

+0

좋은 접근 감사합니다! – Furkan

13

당신은 조건부 술어를 저장 한 후 where 절에 추가 할 수있는 술어의 배열을 만들 수 있습니다 :이 동적 술어의 모든 종류를 추가 할 수 있습니다

List<Predicate> predList = new LinkedList<Predicate>(); 
if(someCondition1){ 
    predList.add(p1); 
}else if(someCondition2){ 
    predList.add(p2); 
} 
predList.add(p3); 
Predicate[] predArray = new Predicate[predList.size()]; 
predList.toArray(predArray); 
query.where(predArray); 

.

+0

하지만 여전히 if/else 톤이있을 것입니다. –