为什么Hibernate的createQuery和createCriteria会返回不同数量的对象?

时间:2014-12-05 10:54:50

标签: java hibernate orm hql criteria

我的表格中有两行

select count(*) from PREFERENCE;

COUNT(*)
----------
2

当我做的时候

session.createQuery("from Preference").list();

我有两个对象。

但是,当我这样做时

session.createCriteria(Preference.class).list();

我得到三个对象 - 第一行重复。

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

EAGER fetch associations are applied for

  
      
  • 通过get()或load()

  • 进行检索   
  • 在导航关联时隐式发生的检索

  •   
  • 条件查询

  •   
  • 如果使用了子选择提取,则HQL查询

  •   

我假设你的Preference实体中有一个EAGER @OneToMany集合。

  1. HQL覆盖了默认的提取计划,因此忽略了EAGET @OneToMany关联,该关联将被表示为未初始化的LAZY代理。

  2. Criteria查询将选择配置文件,对于每个配置文件,您的@OneToMany集合中有两个子项,因此除非您使用不同的结果,否则您将获得指向同一实体的两个父行。

    如果您需要不同的结果,则必须将Criteria查询更改为:

    session
        .createCriteria(Preference.class)
        .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
        .list();