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。 这样做的主要缺点是使用结果集缓冲/行计数。 这两个人不能一起工作。
- SQLGrammarException:无法执行查询
- 如何在hibernate中使用一对一映射执行插入
- Hibernate和@JoinFormula:org.hibernate.mapping.Formula无法强制转换为org.hibernate.mapping.Column
- 启动服务时出现Jpa-hibernate错误
- 如何在hibernate实体中更改列名?
- “Spring事务”和“Hibernate事务”之间有什么区别
- 如何使用Hibernate注释将Java日期映射到mysql中的DATETIME(默认情况下为TIMESTAMP)
- 如何将Hibernate 5安装到Apache Karaf v4中
- 在pg_stat_activity中具有“空闲”状态的持久“COMMIT”查询