加入Hibernate标准时的分页问题

时间:2013-10-24 21:40:28

标签: hibernate hibernate-criteria

我希望在多个表加入条件后进行分页。

问题是:

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

我使用 criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 删除重复的记录。

例如: 通常我在应用删除重复后得到10条记录。 当我将起始索引设置为1并将结束索引设置为5时,我应该得到5条记录,但它返回2或3(大约)。这取决于加入。

请帮帮我。

2 个答案:

答案 0 :(得分:1)

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

  • 首先,在数据库服务器上正确应用了分页。它将返回预期的行数(例如5)。
  • 第二部分是应用程序部分,Hibernate从这5条记录中选择DISTINCT值。

因此,如果实际上有2行加倍加1,则转换将产生3个对象。

正确的(也许是最好的)方式,如何避免这种情况,是不使用集合的提取。如果我们需要显示集合,我们应该懒惰地加载它(例如使用批量大小来减少选择的数量)

如果我们需要将集合用作过滤器,我们应该将其转换为subquery,并再次对根实体进行分页,并使用IN(子查询)子句

想象一下,父表:

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

如果我们要求Parent并加入Child集合,我们会

  1. 在DB服务器上接收5行,
  2. 将在应用程序级别仅转换为3个不同的父对象

答案 1 :(得分:0)

我在这里回答:Pagination with Hibernate Criteria and DISTINCT_ROOT_ENTITY

你需要做3件事,1)得到总数,2)得到你想要的行的ID,然后3)得到你在步骤2中找到的id的数据。真的不是那么糟糕一旦你得到正确的订单,你甚至可以创建一个通用的方法,并发送一个分离的标准对象,使其更抽象。