2

に a を含める必要があるこれらのブール値に基づいて、いくつかのブール値がありPredicateますCriteriaQuery。ただし、指定された例 1 のアプローチは機能しません。関数の 2 回目の呼び出しがwhere()以前の属性をオーバーライドするためです。これは、最後だけPredicateが実行されることを意味します。

通常はPredicates、例 2 のようにスタックします。

ただし、ブール値によって指定された条件により、これは不可能です。例 3 に見られるような状況を防止しようとしています。何か提案はありますか?

例 1

function(boolean a, boolean b, boolean c) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Product> query = cb.createQuery(Product.class);
    Root product = query.from(Product.class);

    query.select(product);

    if(a) {
        query.where(cb.equal(...));
    }
    if(b) {
        query.where(cb.equal(...));
    }
    if(c) {
        query.where(cb.equal(...));
    }

    return em.createQuery(query).getResultList();
}

例 2

query.where(cb.equal(...), cb.equal(...), cb.equal(...));

例 3

if(a && b && c) { query.where(cb.equal(...), cb.equal(...), cb.equal(...)); }
if(a && b && !c) { query.where(cb.equal(...), cb.equal(...)); }
if(a && !b && c) { query.where(cb.equal(...), cb.equal(...)); }
if(a && !b && !c) { query.where(cb.equal(...)); }
(...)
4

1 に答える 1

5

それらをリストに集めて、最後に where 句を設定できます。たとえば、次のようになります。

private final List<Predicate> predicates = new ArrayList<Predicate>(3);
...
if(a) {
    predicates.add(cb.equal(...));
}
if(b) {
    predicates.add(cb.equal(...));
}
if(c) {
    predicates.add(cb.equal(...));
}
...
query.where(predicates.toArray(new Predicate[predicates.size()]));
...
于 2013-02-01T15:53:09.920 に答える