mysql - JPA Criteria 查询在子查询中包含多列

标签 mysql hibernate jpa hibernate-criteria

我正在尝试设计这样的查询:

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[]{}));

以上是我的方法之一,但没有得到正确的结果。

最佳答案

要解决您的问题,您可以将带有 IN 子句的查询转换为带有 EXISTS 子句的查询。 示例:

SELECT *
   FROM TableA ta
WHERE (ta.a, ta.b) NOT IN
 (SELECT tb.a, tb.c
    FROM TableB tb
    WHERE tb.id != 1234)

SELECT *
  FROM TableA ta
 WHERE NOT EXISTS
     (SELECT 1
       FROM TableB tb
        WHERE ta.a = tb.a AND ta.b = tb.b 
      AND TableB.id != 1234)

使用 JPA CriteriaBuilder 的代码将修改为:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<TableA> criteria = cb.createQuery(TableA.class);
Root<TableA> rootTableA = criteria.from(TableA.class);

Subquery<TableB> sq = criteria.subquery(TableB.class);
Root<TableB> rootTableB = sq.from(TableB.class);
sq.select(rootTableB);

List<Predicate> subQueryPredicates = new ArrayList<Predicate>();
subQueryPredicates.add(cb.equal(rootTableA.get("a"), rootTableB.get("a")));
subQueryPredicates.add(cb.equal(rootTableA.get("b"), rootTableB.get("b")));
subQueryPredicates.add(cb.equal(rootTableB.get("id"), 1234));
sq.where(subQueryPredicates.toArray(new Predicate[]{}));

criteria.where(cb.not(cb.exists(sq)));

关于mysql - JPA Criteria 查询在子查询中包含多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45699961/

相关文章:

Spring-data-jpa 渴望获取加入和使用分页不起作用

php - 语法错误或访问冲突 : 1064 You have an error in your SQL syntax in alter table

sql - 错误: Unknown Punctuation String @ 7

spring - 将 Spring MVC 项目转换为 JAX-RS

mysql - 使用连接缓冲区的连接速度极慢

mysql - Hibernate 关于 join 的额外子句

java - 使用 play-framework 2.2.x 删除对象时违反参照完整性约束

java - 将 null 传递给 JPA OneToOne Persist

mysql - Sql 查询 - 获取两个不同日期列之间的结果,其确切日期匹配

mysql - 在 MySQL 中仅选择偶数/奇数行