Hibernate list()是否有效返回重复项?

是否有人知道Hibernate的Criteria.list()Query.list()方法返回多次出现的同一实体的有效性?

我偶尔会发现在使用Criteria API时,在我的类映射定义中更改默认提取策略(从“select”到“join”)有时会影响同一实体的多少引用可以出现在list()的结果输出中,我不确定是否将此视为一个错误。 javadoc没有定义它,只是简单地说“匹配的查询结果列表”。 (多谢你们)。

如果这是预期的和正常的行为,那么我可以自己删除列表,这不是问题,但如果它是一个错误,那么我宁愿避免它,而不是重复删除结果并试图忽略它。

有人有这方面的经验吗?

是的,如果您构建查询以便可能发生这种情况,则完全可以获得重复项。 例如,参见Hibernate CollectionOfElements EAGER获取重复元素

我也开始在Java API中注意到这种行为,因为它开始增长。 很高兴有一种简单的方法可以防止它。 出于实践,我开始追加:

 .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 

对于我返回列表的所有条件。 例如:

 List paymentTypeAccounts = criteria() .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) .list(); 

如果您的对象上有一个子对象列表,并且您的条件将两个表连接在一起,则可能会获得主对象的重复项。

确保不会出现重复的一种方法是使用DistinctRootEntityResultTransformer。 这样做的主要缺点是使用结果集缓冲/行计数。 这两个人不能一起工作。