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对象。我现在明白它为什么这么做了。我想我就是不同意!