【问题标题】:Hibernate Pagination not working as expected休眠分页未按预期工作
【发布时间】:2020-07-03 17:02:14
【问题描述】:

我一直在研究 Hibernate,最近在使用 Hibernate 查询执行分页时遇到了一个奇怪的问题。

我有一个表,它有两列leaseNum、RegistraionDate

表中有12条记录,其中leaseNum列具有唯一值,RegistrationDate列具有相同的日期值。

我将查询设置为获取前 10 个结果作为第 1 页的一部分,方法是按列 RegistraionDate desc 排序。

我得到 12 个结果,它为我划分出 10 个结果,作为页面的一部分,我得到 2 个结果,但我得到的结果与我在第 1 页中得到的结果相同,因为 RegistrationDate 列具有相同的值。

抱歉,我之前提供了完整的细节,下面是我试图参考的场景的说明。

tmpQuery : "select * from CAMS_LEASE_DETAIL mylease0_ 
            order by mylease0_.LEASE_REG_DATE desc"

LeaseNum        RegDate
01.70837.012    24-02-2020 12:02:00
01.70837.011    07-02-2020 12:02:00
01.70837.010    04-02-2020 12:02:00
01.70837.004    17-01-2020 12:01:00
01.70837.005    17-01-2020 12:01:00
01.70837.007    17-01-2020 12:01:00
01.70837.008    17-01-2020 12:01:00
01.70837.009    17-01-2020 12:01:00
01.70837.003    17-01-2020 12:01:00
01.70837.002    17-01-2020 12:01:00
01.70837.001    17-01-2020 12:01:00
01.70837.006    17-01-2020 12:01:00

tmpQuery : "select * from CAMS_LEASE_DETAIL mylease0_ 
            order by mylease0_.LEASE_REG_DATE desc"

第 1 页:

    Query query = session.createQuery(tmpQuery);
    query.setFirstResult(0);
    query.setMaxResults(10);
    

后端查询

select * from 
    ( select  mylease0_.LEASE_NUMBER as LEASE_NUMBER18_2_, 
              mylease0_.LEASE_REG_DATE as LEASE_REG_DATE19_2_ 
    from CAMS_LEASE_DETAIL mylease0_ 
    where mylease0_.ADDRESS_NUMBER='18201' 
    order by mylease0_.LEASE_REG_DATE desc ) 
where rownum <= 10;

检索到的结果集是

01.70837.012    24-FEB-20
01.70837.011    07-FEB-20
01.70837.010    04-FEB-20
01.70837.001    17-JAN-20
01.70837.004    17-JAN-20
01.70837.005    17-JAN-20
01.70837.006    17-JAN-20
01.70837.007    17-JAN-20
01.70837.008    17-JAN-20
01.70837.009    17-JAN-20

第 2 页:

    Query query = session.createQuery(tmpQuery);
    query.setFirstResult(10);
    query.setMaxResults(20);
    

后端查询

select * from 
    ( select row_.*, rownum rownum_ from 
        ( select mylease0_.LEASE_NUMBER as LEASE_NUMBER18_2_,
                mylease0_.LEASE_REG_DATE as LEASE_REG_DATE19_2_ 
         from CAMS_LEASE_DETAIL mylease0_ 
         where mylease0_.ADDRESS_NUMBER='18201' o
         rder by mylease0_.LEASE_REG_DATE desc ) 
     row_ where rownum <= 20) 
 where rownum_ > 10 

检索到的结果集是

01.70837.008    17-JAN-20
01.70837.009    17-JAN-20

而不是获得租约 01.70837.002、01.70837.003

我应该怎么做才能避免这个问题。

我们将不胜感激。
谢谢

【问题讨论】:

    标签: java hibernate pagination


    【解决方案1】:

    我不确定,因为您没有显示查询,但如果您没有包含 order by 子句,那么数据库返回的行的顺序是不确定的。

    所以你的查询应该是这样的:

    from Lease l order by l.leaseNum
    

    由于大多数日期似乎是 17-01-2020 12:01:00,因此仅按该列排序时无法保证行顺序。您应该可以通过在 order 子句中添加第二列来解决该问题:

    from Lease l order by l.registrationDate, l.leaseNum
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 2022-08-17
      相关资源
      最近更新 更多