【问题标题】:Index of a specific row with Hibernate Criteria具有休眠条件的特定行的索引
【发布时间】:2014-04-27 04:17:28
【问题描述】:

给定一个特定的Hibernate Criteria,它可以投影到一个名为"id" 的属性,我想找出具有特定ID 的行的列表索引

使用 SQL (Oracle),我可以通过外部选择来解决这个问题,得到行号(从 1 开始),然后我可以使用它来计算索引(空结果集:-1,非空: r-1)。

select r from (select rownum as r, id from whatever) where id = 12345

注意:rownum 伪列是 Oracle 特定的。
我可以使用 Hibernate Criteria API(使用自定义投影/转换器或任何必要的魔法)以某种方式解决此问题,以将此机制应用于任意条件吗?

【问题讨论】:

    标签: java hibernate hibernate-criteria


    【解决方案1】:

    除非您指定“order by”,否则无法保证返回的行的顺序;在 oracle 以外的数据库(也可能是 oracle)和休眠中。

    如果可以提供 order-by 子句,则可以在返回的集合中简单地使用 indexOf。假设 id 和 hashcode 按预期设置。

    对于使用休眠条件的分页,只需使用:

    criteria.setMaxResults(10); 
    criteria.setFirstResult(20);
    

    并相应调整参数...示例返回 10 行,从第 20 行开始。

    因此,在您的示例中,无论哪个条件查询返回了 id - 在返回的集合上使用 indexof,然后将该结果添加到 setFirstResult() 参数,您将获得数据库中的行索引。

    或者如果你不打算从 oracle 改变,总是有一个 nativequery。

    【讨论】:

    • 这只是返回行数(count(*)),请再读一遍问题。
    • 我正在处理的实际查询是有序的,但即使这样我也无法通过操作查询找到索引?关键是我有大型数据集,我使用分页加载,我需要一个非昂贵的操作来查找已知行的索引(按 id),所以我不能只将整个数据集加载到内存中。我曾希望我能以某种方式将行选择 SQL(见问题)包装在休眠生成的查询周围(通过自定义投影或类似方法)......
    • 我已经在使用第一/最大结果。假设我有大量符合我的条件的记录。如果我知道正确的页面,我确实可以只加载该页面并使用 indexof 找出所需行的索引,但问题是我不知道 which 页面包含我的行(我仍然需要阅读每个页面,直到找到正确的页面,或者我需要知道索引才能找到正确的页面)。
    • @PeterWalser 我会重构代码,以便您可以按页码和 id 查找,或者只使用原生查询 docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch13.html
    • 不幸的是,由于我们已经在所有复杂的搜索中使用了 Hibernate Criteria,我们不能仅仅为了这一功能而更改它们。似乎没有(有效的)解决方案可以与 Hibernate Criteria 一起使用,但是,感谢您的努力,我给予您赏金 :)
    猜你喜欢
    • 2016-10-04
    • 2014-02-04
    • 2016-12-28
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多