我正在尝试使用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
?
暂无答案!
目前还没有任何答案,快来回答吧!