11

JPA 基準クエリの問題に直面しています。if else を使用して条件クエリに複数の 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);
}

しかし、これは良いアプローチではありません。なぜなら、if-else がたくさんあると、繰り返しコードを書くのが非常にうまくいかなくなるからです。これに対する解決策はありますか?

4

2 に答える 2

24

Predicate 配列を作成して条件付き Predicate を格納し、それを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);

これにより、あらゆる種類の述語を動的に追加できます。

于 2014-07-01T20:41:54.720 に答える
7

このようなもの:

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);

そのため、完全な式を作成し、最後に where を 1 回だけ呼び出す場合は、where を毎回呼び出さないでください。

于 2012-12-31T06:42:09.037 に答える