首页 > 解决方案 > 条件构建器中的 if 语句

问题描述

我有类似的东西:

    criteria.select(something.get("somethingId"))
            .where(builder.and(
                    builder.equal(something.get("firstColumn"), firstValue),
                    builder.equal(something.get("thirdColumn", thirdValue), 
            ));

并想要添加到这样的地方:

secondValue != 0 ? builder.equal(something.get("secondColumn"), secondValue) : DONOTHING;

很快:如果 secondValue 的值不同于“0”,我不想设置 builder.equal(secondColumn)。如果可能的话,我想在构建器内部使用它,因为这个构建器会很长,所以我想避免代码重复。

问题是这个 if 条件在分号后不能为空,另一方面我不能在这个构建器表达式中使用正常的 if(secondValue != 0) 。

你能帮我解决这个问题吗?

标签: javacriteria

解决方案


我发现用于构建 JPA 标准的一种模式是使用 List 来添加谓词。这使您可以更轻松地有条件地添加其中一些:

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

predicateList.add(builder.equal(something.get("firstColumn"), firstValue));
predicateList.add(builder.equal(something.get("thirdColumn", thirdValue));
if(secondValue != 0) {
    predicateList.add(builder.equal(something.get("secondColumn", secondValue));
}

criteria.select(something.get("somethingId"))
        .where(predicateList.toArray(new Predicate[predicateList.size()]);

请注意,如果您将多个谓词作为数组添加到where方法中, javax.persistence.criteria.CriteriaQuery它们将自动添加为连词,因此builder.and不需要将所有谓词包装在 a 中。


推荐阅读