具有一对多关系的分页(Hibernate/Spring/Oracle)
对于具有一对多关系的对象列表,我需要实现一致且高效的分页。列表中的项目按组显示,组成员的数量因组而异。某些组可能不包含任何成员。分页应该由组成员的数量决定 例如,考虑一个家庭照片目录。规则如下:具有一对多关系的分页(Hibernate/Spring/Oracle),oracle,spring,hibernate,one-to-many,Oracle,Spring,Hibernate,One To Many,对于具有一对多关系的对象列表,我需要实现一致且高效的分页。列表中的项目按组显示,组成员的数量因组而异。某些组可能不包含任何成员。分页应该由组成员的数量决定 例如,考虑一个家庭照片目录。规则如下: 每个族单元在页面上被分组为一组 同一页面上可以显示任意数量的族 每页大约有10张照片 整个家庭必须出现在同一页上。如果页面上的最后一个系列将超出10张图片的限制,请将该系列保留在此页面上或在下一页上显示,并始终执行此操作 如果没有家庭成员的照片,则家庭分组将不显示任何照片。由于没有图片,此组将不计入10
请分享开发此算法的任何技巧。我将非常感谢任何特定于平台的提示。该应用程序使用Hibernate 3.3.2和Spring 2.5.6。数据库是Oracle 10g。在Hibernate中,您可以限制查询返回的行数,即。E设置页面大小,使用
Query.setMaxResults(nbr);
如果要加载与第一个页面不同的页面,请将页面的第一行设置为
query.setFirstResult(rowNr);
两者都只对主表(family)有效,但不限制子表(photos)中的行数。然后你有非常特殊的要求(如果第一个家庭有三张照片,那么第二个家庭只允许在那一页上有七张照片,而不是像往常一样有十张)。为此,我建议您忘记家族中的Hibernate一对多关系,而是手动执行。这使您可以完全控制照片的加载并限制其数量
- 在family中,不包括照片的hibernate属性
- 相反,您可以在类族中编写一个方法“getPhotos(int nbr_of_photos)”,在该方法中,您可以从照片表(使用会话和查询)手动加载此族的照片。你可以根据需要限制他们的人数。如果方便,可以将结果缓存在族对象中(可选,无需)
- 在照片中,可以将族的id定义为简单的数字或字符串属性,也可以将多对多属性定义为多对多属性