Jpa Criteria Api isFalse和isTrue有什么区别?

时间:2018-08-01 11:01:22

标签: hibernate jpa specifications jpa-criteria

我有这个例子,但是我不能解决它们之间的区别。两者都在创建相同的查询。

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));
}

1 个答案:

答案 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实现的错误。