Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Hibernate的createQuery和createCriteria会返回不同数量的对象?_Java_Hibernate_Orm_Hql_Criteria - Fatal编程技术网

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

Java 为什么Hibernate的createQuery和createCriteria会返回不同数量的对象?,java,hibernate,orm,hql,criteria,Java,Hibernate,Orm,Hql,Criteria,我的桌子上有两排 select count(*) from PREFERENCE; COUNT(*) ---------- 2 当我这么做的时候 session.createQuery("from Preference").list(); 我有两个物体 然而,当我 session.createCriteria(Preference.class).list(); 我得到三个对象-第一行重复 究竟为什么会这样 通过获取或加载进行检索 导航关联时隐式发生的检索 条件查询 HQL查询是否使用了

我的桌子上有两排

select count(*) from PREFERENCE;

COUNT(*)
----------
2
当我这么做的时候

session.createQuery("from Preference").list();
我有两个物体

然而,当我

session.createCriteria(Preference.class).list();
我得到三个对象-第一行重复

究竟为什么会这样

通过获取或加载进行检索

导航关联时隐式发生的检索

条件查询

HQL查询是否使用了子选择获取

我假设您的首选项实体中有一个渴望的@OneToMany集合

HQL覆盖了默认的获取计划,因此忽略了EAGET@OneToMany关联,该关联将表示为未初始化的惰性代理

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

如果希望得到不同的结果,则必须将查询条件更改为:

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

对我现在明白了。这让我有点惊讶——本质上,Hibernate返回它从外部JOIN SQL语句返回的对象表示,而不是按照Java对象中指定的意图调整它。我假设Hibernate会话作为主缓存,对于给定的数据库行,在内存中只有一个Java对象。我现在明白它为什么这么做了。我想我就是不同意!