【问题标题】:Pagination with one-to-many relationship (Hibernate/Spring/Oracle)具有一对多关系的分页(Hibernate/Spring/Oracle)
【发布时间】:2012-09-05 20:24:45
【问题描述】:

我需要为具有一对多关系的对象列表实现一致且高效的分页。列表中的项目按组显示,组成员的数量因组而异。某些组可能不包含任何成员。分页应该由组成员的数量决定。

例如,考虑一个家庭照片目录。以下是规则:

  1. 每个家庭单元在页面上作为一组组合在一起。
  2. 同一页面上可以出现任意数量的系列。
  3. 每页应该有大约 10 张照片。
  4. 整个家庭必须出现在同一页面上。如果页面上的最后一个家庭超出了 10 张图片的限制,请将该家庭保留在此页面上或将其显示在下一页上,并始终如一地执行此操作。
  5. 如果没有家庭成员的照片,家庭分组将显示没有任何照片。由于没有图片,因此该组不计入 10 张图片的限制。
  6. 可能有一个家庭有10张以上的照片,这种情况应该处理。

请分享开发此算法的任何技巧。我也非常感谢任何特定于平台的提示。该应用程序使用 Hibernate 3.3.2 和 Spring 2.5.6。数据库是Oracle 10g。

【问题讨论】:

    标签: oracle spring hibernate one-to-many


    【解决方案1】:

    在 Hibernate 中,您可以限制查询返回的行数,即。 e.设置页面大小,用

    Query.setMaxResults(nbr);
    

    当你想加载不同的页面而不是第一页时,你可以设置页面的第一行

    query.setFirstResult(rowNr);
    

    两者都只对主表(家庭)有效,不限制子表(照片)的行数。然后你有非常特殊的要求(如果第一个家庭有三张照片,那么第二个家庭在该页面上只允许七张照片,而不是像往常一样十张)。为此,我建议忘记家庭中的 Hibernate 一对多关系,而您手动进行。这使您可以完全控制加载照片并限制照片数量。

    • 在家庭中包含照片的休眠属性。
    • 相反,您在类族中编写了一个方法“getPhotos(int nbr_of_photos)”,您可以在其中手动从照片表中加载该族的照片(使用会话和查询)。您可以根据需要限制他们的数量。如果方便(可选,非必需),您可以将结果缓存在族对象中。
    • 在 photo 中,您可以将族的 id 定义为简单的数字或字符串属性,或者您可以为族定义多对多属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2015-07-20
      • 2021-02-16
      • 1970-01-01
      相关资源
      最近更新 更多