【问题标题】:Is it valid for Hibernate list() to return duplicates?Hibernate list() 返回重复项是否有效?
【发布时间】:2010-12-06 07:47:07
【问题描述】:

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

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

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

有人有这方面的经验吗?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    是的,如果您构建查询以使这种情况发生,则完全有可能获得重复项。参见例如Hibernate CollectionOfElements EAGER fetch duplicates elements

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
      

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

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

      【讨论】:

        【解决方案4】:

        我在使用 Criteria API 时遇到了完全相同的问题。对我来说,简单的解决方案是在查询中将 distinct 设置为 true,例如

        CriteriaQuery<Foo> query = criteriaBuilder.createQuery(Foo.class);
        query.distinct(true);
        

        我之前想到的另一个可能的选择是将结果列表简单地传递给 Set,根据定义,它也只有一个对象的单个实例。

        【讨论】:

          猜你喜欢
          • 2016-05-15
          • 2019-01-20
          • 1970-01-01
          • 1970-01-01
          • 2012-10-26
          • 2014-06-30
          • 2016-08-20
          • 1970-01-01
          • 2013-07-17
          相关资源
          最近更新 更多