If 语句在 criteriaBuilder 中

If statement inside criteriaBuiilder

我有类似的东西:

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

你能帮我吗?

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

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

请注意,如果您将多个谓词作为数组添加到 javax.persistence.criteria.CriteriaQuerywhere 方法中,它们将自动作为连词添加,因此将它们全部包装在 builder.and 中没有必要。