【问题标题】:Pagination Issue while join in Hibernate Criteria加入休眠条件时的分页问题
【发布时间】:2013-11-03 19:50:25
【问题描述】:

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

问题是:

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

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

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

请帮帮我。

【问题讨论】:

    标签: hibernate hibernate-criteria


    【解决方案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. 在数据库服务器上收到 5 行,
    2. 将在应用程序级别仅转换为 3 个不同的父对象

    【讨论】:

    • 感谢您的回复,但我的情况,我必须在 Criteria 中使用相同的;我不能将IN 直接用于来自另一个标准的标准,因为我必须使用 DetachedCriteria。但是在 DetachedCriteria 中我无法应用分页。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 2017-09-25
      相关资源
      最近更新 更多