Jpa Criteria Api isFalse 和 isTrue 有什么区别?
What is the difference Jpa Criteria Api isFalse and isTrue?
我有这个例子,但我无法解决它们之间的区别。他们都在创建相同的查询。
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));
}
请注意,我还没有测试我的答案,而且 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 实现的错误。
我有这个例子,但我无法解决它们之间的区别。他们都在创建相同的查询。
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));
}
请注意,我还没有测试我的答案,而且 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 实现的错误。