加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在JPA Criteria API中使用子查询中的ORDER BY有哪些替代

发布时间:2020-12-15 00:53:17 所属栏目:Java 来源:网络整理
导读:考虑以下两个表: 项目(id,project_name) 状态(id,id_project,status_name) Status包含项目所在的所有状态. 让我们说我们想要查询最新状态名为“new”的所有项目.我想出的Sql查询是: SELECT q.id_project FROM status qWHERE q.status_name like 'new'AND q
考虑以下两个表:

>项目(id,project_name)
>状态(id,id_project,status_name)

Status包含项目所在的所有状态.

让我们说我们想要查询最新状态名为“new”的所有项目.我想出的Sql查询是:

SELECT q.id_project FROM status q
WHERE q.status_name like 'new'
AND q.id IN (
    SELECT TOP 1 sq.id from status sq
    WHERE q.id_project = sq.id_project 
    ORDER BY sq.id DESC )

我正在尝试使用Criteria API复制上述查询,我??注意到类CriteriaQuery的方法为orderBy,但类Subquery没有.

我到目前为止提出的标准查询是:

CriteriaQuery<Project> q = criteriaBuilder.createQuery(Project.class);
Root<Status> qFrom       = q.from(Status.class);
Subquery<Integer> sq     = q.subquery(Integer.class);
Root<Status> sqFrom      = sq.from(Status.class);

sq.select(sqFrom.get(Status_.id))
  .where(criteriaBuilder.equal(sqFrom.get(Status_.project),qFrom.get(Status_.project))

我被困在这里,因为Subquery sq没有任何方法可以对结果进行排序并只返回最新的结果.

排序子查询以便在上述场景中获得所需结果的替代方法是什么?

解决方法

可以使用SELECT MAX而不是SELECT TOP 1 … ORDER BY …来编写子查询:
SELECT q.id_project FROM status q
WHERE q.status_name like 'new'
AND q.id = (
    SELECT MAX(sq.id) from status sq
    WHERE q.id_project = sq.id_project)

与查找最大值相比,订购所有记录的速度较慢,这也会更快.如上所述,它可以转换为CriteriaQuery.

遗憾的是,Criteria Queries不支持子查询中的排序 – 请参阅以下相关答案:

https://stackoverflow.com/questions/19549616#28233425
https://stackoverflow.com/questions/5551459#5551571

如果您确实需要ORDER BY(例如,在下面的示例中允许一系列值),则可以使用本机查询而不是CriteriaQuery:

Query query = entityManager.createNativeQuery(
    "SELECT bar FROM foo WHERE bar IN (SELECT TOP 10 baz FROM quux ORDER BY quuux)");

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读