【问题标题】:Hibernate: how to select last N rows in ascending order of id? (in single query)Hibernate:如何按id的升序选择最后N行? (在单个查询中)
【发布时间】:2016-10-18 04:16:38
【问题描述】:

休眠版本:5.2

我正在尝试使用子查询来做,并使用 setMaxResults(int)。

session.createQuery(
"FROM ( SELECT * FROM tickets ORDER BY id DESC limit 3) sub ORDER BY id ASC"
);

但是,HQL 子查询只能出现在 select 或 where 子句中,并且在 hibernate 中不能使用 limit。

我怎样才能在休眠状态下做到这一点?


更新 - 明确说明

例如,从 id=1 到 id=10 有 10 个数据条目。

我想通过仅一个查询 + 不做进一步的数据处理,以id的升序选择最后3个数据。

db 的结果是 id=8 到 id=10

谢谢。

【问题讨论】:

  • 感谢您的回复。那篇文章只是得到最后 n 行,但不是按 id 的升序排列。而且我不想要两个查询然后混合它。我想要一个查询从数据库中获取数据而不处理数据。

标签: java hibernate hql hibernate-5.x


【解决方案1】:

假设您拥有110 的ID,并且您想要最后一个N=3

采取你的方法

SELECT * FROM tickets ORDER BY id DESC

将按从101 的顺序返回ID。然后,您希望按升序获取最后一个 N=3。这意味着您希望 ids 31 按升序排列。

按升序选择第一个N id 会有什么问题?

session.createQuery(
    "FROM tickets ORDER BY id ASC"
).setMaxResults(n);

【讨论】:

  • 感谢您的回复。这不是我的意思。我已经更新了问题以使其清楚。
【解决方案2】:

您可以使用Query setFirstResult(int startPosition)Query setMaxResults(int maxResult) 来实现它。通常用于分页。

投机取巧,这里可以降序获取前3条记录,所以只能使用Query setMaxResults(int maxResult)

【讨论】:

  • 我认为它只适用于常量数据库。例如,QUERY.setFirstResult(6).setMaxResults(3)。我误会了吗?如果是动态数据库,是否可以在没有额外查询的情况下获得 int startPosition?
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 2020-12-13
  • 1970-01-01
  • 2010-09-25
  • 2017-02-12
  • 2014-07-31
  • 2023-03-17
  • 2015-07-24
相关资源
最近更新 更多