在Query vs Lazy hibernate中加入表

时间:2016-02-20 02:43:02

标签: hibernate

我已经禁用了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();

2 个答案:

答案 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列表的标准,并将其设置为你在原始标准上返回的对象。