0

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

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

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

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

4

1 回答 1

1

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

Query.setMaxResults(nbr);

当您想加载与第一页不同的页面时,您可以将页面的第一行设置为

query.setFirstResult(rowNr);

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

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