加入Hibernate条件时出现分页问题

加入Hibernate条件时出现分页问题,hibernate,hibernate-criteria,Hibernate,Hibernate Criteria,我想在多表联接条件之后进行分页 问题是: 加入表时生成的重复记录应用于记录集的分页(有重复)。 我使用这个criteria.setResultTransformer(criteria.DISTINCT\u ROOT\u ENTITY)删除重复记录 例如: 正常情况下,在应用删除重复后,我得到了10条记录。 当我将开始索引设置为1,结束索引设置为5时,我应该得到5条记录,但它返回2或3(大约)。这取决于连接 请帮帮我。这里的问题在于应用了两种不同的技术 首先,在DB服务器上正确应用了分页。它将返

我想在多表联接条件之后进行分页

问题是:

加入表时生成的重复记录应用于记录集的分页(有重复)。

我使用这个criteria.setResultTransformer(criteria.DISTINCT\u ROOT\u ENTITY)删除重复记录

例如: 正常情况下,在应用删除重复后,我得到了10条记录。 当我将开始索引设置为1,结束索引设置为5时,我应该得到5条记录,但它返回2或3(大约)。这取决于连接


请帮帮我。

这里的问题在于应用了两种不同的技术

  • 首先,在DB服务器上正确应用了分页。它将返回预期的行数(例如5行)
  • 第二部分是应用程序部分,Hibernate从这5条记录中选择不同的值
因此,如果实际上有两行加上一行,转换将产生3个对象

正确的(也许是最好的)方法,即如何避免这种情况,是不使用集合的获取。如果需要显示集合,则应延迟加载(例如,使用批量大小来减少选择的数量)

如果我们需要将集合用作筛选器,我们应该将其转换为
子查询
,然后在IN(subquery)子句就位的情况下再次对根实体进行分页

想象一下,父表:

ParentId, Code
1       , 'P1' 
2       , 'P2'
3       , 'P3'
子表:

ChildId , Code , ParentId
1       , 'C1' , 1
2       , 'C2' , 1
3       , 'C3' , 2
4       , 'C4' , 2
5       , 'C5' , 3
如果我们要求一个
家长
,同时加入
孩子
集合,我们会

  • 在数据库服务器上接收5行
  • 将在应用程序级别上仅转换为3个不同的父对象
  • 我在这里回答:


    您需要做3件事,1)获取总计数,2)获取所需行的ID,然后3)获取步骤2中找到的ID的数据。一旦你得到正确的顺序,这真的不是那么糟糕,你甚至可以创建一个泛型方法并发送一个分离的criteria对象,使其更抽象。

    谢谢你的回复,但我的情况是,我必须在criteria中使用相同的方法;我不能使用中的
    直接从另一个标准中删除标准,因此我必须使用DetachedCriteria。但在DetachedCriteria中,我无法应用分页。