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

ska*_*man 29 java hibernate

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

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

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

有人有这方面的经验吗?

Eem*_*ola 23

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

  • +1.我怎么能不赞成链接到我答案的人呢?:-)说真的,但是 - 是的,休眠可能返回重复时,"一对多"关联或者与渴望声明多于一个获取或使用相同的查询中连接抓取检索.请看14.3底部的注释:http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html#queryhql-joins (6认同)
  • 更新链接:http://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch16.html#queryhql-joins (3认同)

Sam*_*rry 6

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

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
Run Code Online (Sandbox Code Playgroud)

至于我返回列表的所有条件.例如:

List<PaymentTypeAccountEntity> paymentTypeAccounts = criteria()
  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
  .list();
Run Code Online (Sandbox Code Playgroud)