0

我有这个例子,但我无法解决它们之间的区别。他们都在创建相同的查询。

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

1 回答 1

1

请注意,我没有测试我的答案,并且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))or是有意义的cb.isFalse(root.get(TransactionProjection_.active))

我很惊讶您的示例中没有引发查询语法异常,但它可能是 JPA 实现的错误。

于 2018-08-02T07:57:27.817 回答