使用criteriabuilder排除 predicate 条件

y0u0uwnf  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(262)

我正在尝试使用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,每个b包含c。我需要排除所有的as,因为其中一个cs是错误的(不等于允许的行)。
我有一个 predicate ,它被添加到查询中,精确地查找我不需要的项,它提取所有条目:

final Optional<Predicate> negativePredicate = allowedLines.stream()
            .map(line -> criteriaBuilder.notEqual(c, line))
            .reduce(criteriaBuilder::and)
            ;

为了排除此结果,我尝试在查询中添加此的否定:

myListOfPredicates.add(criteriaBuilder.not(negativePredicate));

但不幸的是,当a包含一个b,而c为null时,它也删除了这些情况(a->b->c==空)
正 predicate (反之亦然)也返回uncorrect as,其中包含2个b,其中一个c等于null,第二个c是错的。
(a->b1->c错误->b2->c==null)

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

否则我怎么能排除 negativePredicate 把所有的 null ?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题