【发布时间】:2018-01-23 19:03:29
【问题描述】:
我正在尝试设计这样的查询:
SELECT *
FROM TableA
WHERE (a AND b AND C) NOT IN
(SELECT *
FROM TableB
WHERE TableB.id != 1234)
我真正想做的是从 TableA 中获取所有记录,除非 a、b 和 c 的列值都在 TableB 中并且 ID 恰好是 1234。
问题(或者我认为)是我需要以某种方式构造这个查询,以便我根据上面的查询进行过滤,但它还需要匹配其他谓词列表,使其看起来像这个:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<TableA> q = cb.createQuery(TableA.class);
Root<TableA> c = q.from(TableA.class);
Subquery<TableB> sq = q.subquery(TableB.class);
Root<TableB> ac = sq.from(TableB.class);
List<Predicate> predicates = new ArrayList<Predicate>();
sq.select(ac);
sq.where(cb.equal(ac.get("id"), 1234));
predicates.add(cb.not(cb.in(c.get("a")).value(sq)));
predicates.add(cb.not(cb.in(c.get("b")).value(sq)));
predicates.add(cb.not(cb.in(c.get("c")).value(sq)));
....
more predicates added
....
q.where(predicates.toArray(new Predicate[]{}));
以上是我的一种方法,但没有得到正确的结果。
【问题讨论】:
标签: mysql hibernate jpa hibernate-criteria