2

我想在多表加入条件后进行分页。

问题是:

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

我使用这个条件。setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 删除重复的记录。

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

请帮帮我。

4

2 回答 2

1

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

  • 首先,在数据库服务器上正确应用了分页。它将返回预期的行数(例如 5)。
  • 第二部分是 Application 部分,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. 在数据库服务器上接收 5 行,
  2. 这将在应用程序级别仅转换为 3 个不同的父对象
于 2013-10-25T02:46:47.077 回答
0

我在这里回答了这个问题:Pagination with Hibernate Criteria and DISTINCT_ROOT_ENTITY

您需要做 3 件事,1) 获取总数,2) 获取所需行的 id,然后 3) 获取步骤 2 中找到的 id 的数据。顺序正确,您甚至可以创建一个通用方法并向其发送一个分离的标准对象以使其更加抽象。

于 2014-05-12T20:30:50.577 回答