【问题标题】:Hibernate and rownum in inner query内部查询中的休眠和rownum
【发布时间】:2010-02-24 23:06:15
【问题描述】:

我在 oracle 中有以下查询,我想在 hibernate 中使用,但无法确定如何在内部查询中使用 rownum 变量。查询如下:

select emp.prof_key, emp.prof_display_name
from empinst.emp emp
where emp.prof_key IN (select x.object_key
                   from (select event.object_key as object_key
                         from empinst.eventlog event
                         where event.event_name = 'profiles.created'
                         and event.event_source = 'Profiles'
                         order by event.created desc) x
                   where rownum <= 10)

我可以弄清楚如何做到这一点的唯一方法是将查询分成两部分,但我认为在休眠中必须有更有效的方法。

提前致谢。

迈克尔。

【问题讨论】:

  • 为什么要限制子查询?子查询中返回的行数与实际结果集中的行数之间(通常)没有太大关系。
  • 从 eventlog 中随意挑选前 10 行似乎毫无意义。是否打算进行某种随机抽样?另外,“rownum 变量”是什么意思?您使用了文字值,您是在问如何在那里使用绑定变量吗?
  • rownum变量是oracle中的保留字,返回行号,用于分页。我只想显示十行的原因是因为我想查看最近的 10 条事件日志记录。 10 的数量是任意的,但我只想查看最多 x 条记录。表本身可以包含 10,000 条记录...通过运行不带内部查询的查询和 rownum 查询在大约 24 秒内返回,内部查询在 0.3 秒内返回。

标签: java oracle hibernate


【解决方案1】:

您的查询不会过滤最近的 10 条记录。由于没有 ORDER BY 子句,它将返回 10 个 random 记录(随机为不可靠的顺序)。

我不熟悉 hibernate 的限制,但与所有限制工具一样,我很确定您可以通过深思熟虑的观点来解决它们。

例如,此视图将包含一个排名列,您可以使用它来根据排序列event_date 过滤(event_name, event_source) 的任意组合的 10 条最新记录:

CREATE VIEW eventlog_rank_v AS 
SELECT e.*, 
       row_number() OVER (PARTYTION BY e.event_name, 
                                       e.event_source 
                          ORDER BY e.event_date DESC) event_rank
  FROM empinst.eventlog e;

【讨论】:

  • 您好!查询中缺少 order by(我将其从休眠状态中拉出并开始在 sqldev 中使用它来修复它并错过了 order by 语句。我已经编辑了原始问题以显示它的 order by。
  • @Michael:您的查询仍然需要一些修复:ORDER BY 子句在WHERE 子句之后进行评估。基本上,您的查询意味着 随机 选择 10 行,然后是 ORDER BY event.created。有关 TOP-N 查询的示例,请参阅:stackoverflow.com/questions/1735614/how-to-select-n-rows/…stackoverflow.com/questions/909923/more-elegant-sql/…
  • 你是对的。我更仔细地查看了查询和您提供的链接,看起来查询完全按照您的描述进行。我再次对其进行了更改,因为我现在可以看到它正在生成正确的数据。
猜你喜欢
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2012-11-08
  • 2011-08-09
相关资源
最近更新 更多