我有这个例子,但是我不能解决它们之间的区别。两者都在创建相同的查询。
public static Specification<TransactionProjection> hasDestinationPartyNumber(List<PartyNumber> values) {
if (CollectionUtils.isEmpty(values)) return not();
return (root, query, cb) -> cb.isTrue(root.get(TransactionProjection_.column1).in(values));
}
public static Specification<TransactionProjection> hasNotDestinationPartyNumber(List<PartyNumber> values) {
if (CollectionUtils.isEmpty(values)) return not();
return (root, query, cb) -> cb.isFalse(root.get(TransactionProjection_.column1).in(values));
}
答案 0 :(得分:0)
请注意,我尚未测试答案,isTrue(...)/isFalse(...)
的文献记录不充分。
我认为 isTrue(...)/isFalse(...)
在您的示例中无效的原因是,SQL中的逻辑测试(以及扩展为JPQL / Criteria API中的逻辑测试)是易于转换为SQL)没有布尔值(实际上,它们根本不是r值)。例如,表达式WHERE (a IN (1, 2, 3)) = TRUE
无效,因为a IN (1, 2, 3)
部分的计算结果无效。
isTrue(...)/isFalse(...)
旨在应用于具有实际值的表达式。例如,如果TransactionProjection
实体具有boolean active
属性,则使用cb.isTrue(root.get(TransactionProjection_.active))
或cb.isFalse(root.get(TransactionProjection_.active))
是有意义的。
我很惊讶在您的示例中没有引发查询语法异常,但这可能是JPA实现的错误。