java - 条件构建器中的 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) 。
你能帮我解决这个问题吗?
解决方案
我发现用于构建 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 中。
推荐阅读
- python - Python:无法使用烧瓶应用程序连接到本地主机
- sql - 如何检查连接表的时间范围内的行?
- ruby-on-rails - 嵌套路由中的 Rails 新路径
- html - CSS Flexbox - 如何移动响应?
- android - Ionic App - Android 应用程序构建卡在 app:mergeDebugResources 上,没有错误
- firebase-realtime-database - Firebase 实时数据库 uid 密钥限制
- xcode - 如何获取“Developer ID Application”或“Developer ID Installer”证书的私钥?
- reactjs - 如何使用反应测试库检查 span 元素的值是否等于另一个值?
- scala - 写入表后 Spark DataFrame 变为空
- javascript - jquery.min.js:2 jQuery.Deferred 异常:无法读取未定义的属性“on”类型错误:无法读取未定义的属性“on”