Java 使用criteriaBuilder排除谓词条件

Java 使用criteriaBuilder排除谓词条件,java,hibernate,criteria-api,Java,Hibernate,Criteria Api,我正在尝试使用CriteriaAPI构建Hibernate查询 这是我的模型: final Root<A> a = query.from(A.class); final Join<DbTransactionHistoryItem, Collection<B>> bs = root.join("Bs", JoinType.LEFT); final Join<B, Collection<C>> c = root.join

我正在尝试使用CriteriaAPI构建Hibernate查询

这是我的模型:

final Root<A> a = query.from(A.class);
final Join<DbTransactionHistoryItem, Collection<B>> bs = root.join("Bs", JoinType.LEFT);
final Join<B, Collection<C>> c = root.join("C", JoinType.LEFT);

    
但不幸的是,它也删除了A包含一个B而C为空的情况。 (A->B->C==null)

正谓词(反之亦然)也返回不正确的As,其中包含2个B,一个C等于null,第二个错误

(A->B1->C是错误的 ->B2->C==null)

final Optional positivePredicate=allowedLines.stream()
.map(line->criteriaBuilder.equal(c.type(),line))
.reduce(criteriaBuilder::or)
.map(pr->
标准构建器(
公共关系,
criteriaBuilder.isNull(c)
)
);
否则,我如何排除否定预测的结果以保持所有的
为空

final Optional<Predicate> negativePredicate = allowedLines.stream()
            .map(line -> criteriaBuilder.notEqual(c, line))
            .reduce(criteriaBuilder::and)
            ;
myListOfPredicates.add(criteriaBuilder.not(negativePredicate));
final Optional<Predicate> positivePredicate = allowedLines.stream()
            .map(line -> criteriaBuilder.equal(c.type(), line))
            .reduce(criteriaBuilder::or)
            .map(pr ->
                    criteriaBuilder.or(
                            pr,
                            criteriaBuilder.isNull(c)
                    )
            );