我已经禁用了Lazy抓取,我在Criteria查询中加入了表。但是在我尝试获取结果后执行时,由于没有进行延迟初始化,因此抛出错误。
如何解决此问题?
public static String LST_LINEITEM_ANNUAL_ATT = "contractLineItem.lineitemAnnualAtt";
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name="LINEITEM_ID",insertable=false,updatable=false)
private Set<PLineitemAnnualAtt> lineitemAnnualAtt;
标准查询
List lstLineitemSublock = null;
Criteria criteria = session.createCriteria(PContractLineitem.class, PContractLineitem.CLASS_ALAIS_NAME)
//.createAlias(PContractLineitem.LST_LINEITEM_SUBBLOCK, PLineitemSubblock.CLASS_ALAIS_NAME)
.createAlias(PContractLineitem.LST_LINEITEM_ANNUAL_ATT, PLineitemAnnualAtt.CLASS_ALAIS_NAME)
;
this.setAttribute(criteria, restrictions);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
lstLineitemSublock = criteria.list();
答案 0 :(得分:1)
考虑在JoinType.LEFT_OUTER_JOIN
方法中指定createAlias
。
将createAlias(PContractLineitem.LST_LINEITEM_ANNUAL_ATT, PLineitemAnnualAtt.CLASS_ALAIS_NAME)
更改为createAlias(PContractLineitem.LST_LINEITEM_ANNUAL_ATT, PLineitemAnnualAtt.CLASS_ALAIS_NAME, JoinType.LEFT_OUTER_JOIN)
应该会有所帮助。
关于为什么它没有与INNER JOIN合作,经过一些研究后我发现http://forum.spring.io/forum/spring-projects/data/35460-hibernate-createcriteria-question令人满意。
那说:
当使用别名-defaulting到内部联接时 - 调用返回的父实体将联合集合取消初始化。 Hibernate显然会丢弃与集合数据相关的列,并且在尝试访问集合时,会发生另一个选择,由映射元数据生成,因此它将获取整个集合。
答案 1 :(得分:0)
您好,你可以这样:
@OneToMany(fetch = FetchType.LAZY, optional = false)
为:
@OneToMany(fetch = FetchType.EAGER, optional = false)
你也可以破解它,创建另一个返回lineitemAnnualAtt列表的标准,并将其设置为你在原始标准上返回的对象。