与一对多关系的分页(Hibernate / Spring / Oracle)

时间:2012-09-05 20:24:45

标签: oracle spring hibernate one-to-many

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

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

  1. 每个家庭单位在页面上组合在一起。
  2. 任意数量的家庭都可以出现在同一页面上。
  3. 每页应该有大约10张照片。
  4. 整个家庭必须出现在同一页面上。如果页面上的最后一个系列将超出10个图片限制,请将该系列保留在此页面上或在下一页上显示它们,并始终如一地执行此操作。
  5. 如果没有家庭成员的照片,家庭分组将显示没有任何照片。由于没有图片,因此该组不会计入10张图片限制。
  6. 可以有一个超过10张照片的家庭,这种情况应该处理。
  7. 请分享开发此算法的任何提示。我非常感谢任何特定于平台的提示。该应用程序使用Hibernate 3.3.2和Spring 2.5.6。该数据库是Oracle 10g。

1 个答案:

答案 0 :(得分:1)

在Hibernate中,您可以限制查询返回的行数,即。即使用

设置页面大小
Query.setMaxResults(nbr);

如果要加载不同页面然后加载第一页,则使用

设置页面的第一行
query.setFirstResult(rowNr);

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

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