4

我面臨JPA標準查詢的問題。我怎麼可以添加多個where子句中我的標準與其他如查詢...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);取代以前設置的條款條件p1和p2。我找到了替代就是合像下面

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

但是,這不是一個好辦法,因爲當有很多的if-else這變得非常不好寫重複的代碼。任何人都可以爲此提供解決方案嗎?

回答

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 –