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.CriteriaQuery
的 where
方法中,它们将自动作为连词添加,因此将它们全部包装在 builder.and
中没有必要。
我有类似的东西:
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.CriteriaQuery
的 where
方法中,它们将自动作为连词添加,因此将它们全部包装在 builder.and
中没有必要。