【问题标题】:how to write subquery using criteria如何使用条件编写子查询
【发布时间】:2020-06-19 02:09:21
【问题描述】:

请帮我为这个查询编写条件生成器

SELECT * 
FROM XYZ 
WHERE date_v < "2020/01" AND 
      id NOT IN (SELECT id FROM XYZ WHERE date_v = '2020/01')

我看过using subqueries in jpa criteria api,但我无法弄清楚

我尝试过使用子查询和连接,但毕竟我知道我需要更清楚地了解查询条件的用法,但它会引发不同的错误。非常感谢任何帮助

【问题讨论】:

标签: java mysql sql hibernate jpa


【解决方案1】:

您必须使用Long idLocalDate date_v 字段创建XyzEntity

// query
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<XyzEntity> query = cb.createQuery(XyzEntity.class);
Root<XyzEntity> root = query.from(XyzEntity.class);

LocalDate date = LocalDate.of(2020, 1, 1);

// subquery
Subquery<Long> subQuery = query.subquery(Long.class);
Root<XyzEntity> subRoot = subQuery.from(XyzEntity.class);
Predicate idSubPredicate = cb.equal(root.get("id"), subRoot.get("id"));
Predicate dateSubPredicate = cb.equal(subRoot.get("date_v"), date);

subQuery.select(subRoot.get("id")).where(idSubPredicate, dateSubPredicate);

// query predicates
Predicate datePredicate = cb.greaterThan(root.get("date_v"), date);
Predicate notExistsPredicate = cb.exists(subQuery).not();

// query result
query.select(root).where(datePredicate, notExistsPredicate);

List<XyzEntity> result = entityManager.createQuery(query).getResultList();

【讨论】:

  • 它执行没有错误,但结果数据没有返回它返回null,即使有数据
  • @alex valuiskyi 有什么想法吗?
  • 在没有一行代码的情况下跟踪错误是很复杂的。有很多错误会导致你的问题stackoverflow.com/help/minimal-reproducible-example
  • 很酷,我想通了。问题是当我们在子查询中搜索 NOT IN id 时。 id 不适用。像 root.get("id").in(subQuery).not()。在 cb.exists(subQuery).not();
  • 代码是在没有测试的情况下编写的,所以我在答案中错过了idSubPredicate。现在应该可以工作了
【解决方案2】:

我已经在 cmets 中提到了答案的更正,但我觉得提供所有解决方案似乎都很好并且可以帮助其他人。这就是为什么要回答。

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Entity> query = cb.createQuery(Entity.class);
    Root<Entity> root = query.from(Entity.class);
    // subquery
    Subquery<Long> subQuery = query.subquery(Long.class);
    Root<Entity> subRoot = subQuery.from(Entity.class);
    Predicate subPredicate = cb.equal(subRoot.get("date_v"), dateValue);

    subQuery.select(subRoot.get("id")).where(subPredicate);

    // query predicates
    Predicate datePredicate = cb.lessThan(root.get("date_v"), dateValue);
    Predicate notExistsPredicate = root.get("id").in(subQuery).not();

    // query result
    query.select(root).where(datePredicate, notExistsPredicate);
    Query d = entityManager.createQuery(query);
    List<Entity> resultList = d.getResultList()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 2020-10-17
    • 2011-09-09
    • 2014-03-29
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多