这似乎是一个众所周知的问题,可以在这里阅读到:http://blog.xebia.com/2008/12/11/sorting-and-pagination-with-hibernate-criteria-how-it-can-go-wrong-with-joins/,甚至在Hibernate FAQ中也有相关内容:https://community.jboss.org/wiki/HibernateFAQ-AdvancedProblems#Hibernate_does_not_return_distinct_results_for_a_query_with_outer_join_fetching_enabled_for_a_collection_even_if_I_use_the_distinct_keyword。此前也曾在SO上讨论过:How to get distinct results in hibernate with joins and row-based limiting (paging)?。问题在于,即使参考了所有这些资源,我仍然无法解决我的问题,这似乎与标准问题有点不同,尽管我不确定。标准解决方案涉及创建两个查询,第一个用于获取不同的ID,然后在更高级别的查询中使用这些ID来获取所需的分页。在我的情况下,Hibernate类类似于:
A
- aId
- Set<B>
B
- bId
在我看来,子查询似乎对我来说运行良好,并能够获取不同的aIds,但外部查询应该进行分页,却再次获取重复数据,因此子查询中的distinct没有效果。
假设我有一个A对象,其中包含一组四个B对象,我的分析是由于集合的引入,在获取数据时会出现问题。
session.createCriteria(A.class).list();
Hibernate正在将指向同一对象的四个引用填充到列表中。因此,标准解决方案对我无效。
请有人帮忙提出解决方案吗?
编辑:我已决定从不同的结果集自己进行分页。另一种同样糟糕的方法是延迟加载B对象,但这将需要为所有A对象查询获取相应的B对象。