当前位置: 首页 > 知识库问答 >
问题:

除了在JPA标准API中的子查询中使用ORDER BY之外,还有什么其他选择?

韩刚洁
2023-03-14
  1. 项目(id,project_name)
  2. 状态(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 )
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))

在上面描述的场景中,为了得到所需的结果,对子查询进行排序还有什么替代方法?

共有1个答案

长孙淳
2023-03-14

可以使用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。

不幸的是,条件查询不支持子查询中的排序-请参阅以下相关答案:

Query query = entityManager.createNativeQuery(
    "SELECT bar FROM foo WHERE bar IN (SELECT TOP 10 baz FROM quux ORDER BY quuux)");
 类似资料:
  • 问题内容: 我有两个班,并有一个互相一一对应关系。这是它们的注释方式。 如您所见,是关系的所有者,并且是此双向关系的另一端。InvitedTech也与 Now 有关系,当我编写一个简单查询以获取所有排期时,它总共触发三个查询。第一个让我得到结果,但是触发了另外两个查询。 查询所有航班(这是我唯一需要的航班) 通过InvitedTech和Flight之间的联接进行查询 在被邀请的科技公司和酒店之间进

  • 问题内容: 我想在后端计算地理围栏违规和行车距离计算。这是我第一次使用google API。我在网上发现的所有内容都是针对Android的。是否有特定于常规计算的API。 问题答案: 您可以自己实现它,而无需使用任何框架,这非常容易… 我假设您要检查您是否在圆形地理围栏内。 为此,只需计算圆心与您的位置之间的距离(经度,纬度)。如果距离小于圆半径,则说明您在地理围栏内,否则就在地理围栏外。 像这样

  • Mybatis 和 Hibernate 各有各的优点吧,感觉用久了有点腻了。 查了一下,还有一种基于 JOOQ 的查询,像写 C# 的 LINQ 一样用 Java 来写 SQL,站内有一个介绍看了感觉还行 https://segmentfault.com/a/1190000045244062 所以 JOOQ、Hibernate、Mybatis Java 应该就是这三种 Dao Layer 的框架了

  • 尝试编写一个标准api查询。 应该作为参数传递,并且可以更改。我在代码中添加了实体。 感谢任何帮助或指导。 这就是我目前的情况: 我现在能够获取正确的数据,但列表没有排序。这是我在日志中看到的,生成了两个查询,一个有顺序,另一个没有顺序。

  • 我想在使用jpa条件的查询中显示父子关系。但是我一直在学习如何设置通过表达式连接 其中,transquery是由具有多个选择和多个联接的criteriaQuery生成的 我想如下所示显示父事务及其子事务,但在条件查询中使用

  • 我有2个班: 我试图创建一个带有动态order by和参数的查询,例如:我想在DrcommentsPK时选择所有Drcomments记录。commentPrimaryCode等于1,其顺序为DrcommentsPK。注释第二代码。这就是我尝试的: 问题是我得到的结果列表没有按commentSecondaryCode desc顺序排序。。 我做错什么了吗?如何做到这一点?如何创建按eMedTable