Hibernate 4.3.5 DetachedCriteria没有获取惰性列表

时间:2014-06-17 17:16:33

标签: java hibernate hibernate-criteria detachedcriteria

我有一个简单的查询,工作了很长时间,现在我在我的代码中改变了一些东西:
(hibernate.cfg.xml中)

<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>

和以下代码:

public UserEn findByIDFetch(Long id, String... fetches) {
    beginTransaction();

    DetachedCriteria dc = DetachedCriteria.forClass(UserEn.class);
    for (String fetch : fetches) {
        dc.createAlias(fetch, fetch, JoinType.INNER_JOIN);
    }

    dc.add(Restrictions.eq("id", id));

    UserEn result = (UserEn) dc.getExecutableCriteria(getSession()).uniqueResult();
    commitTransaction();
    return result;
}

提交后,结果对象没有加载列表(即来自fetches
如果我在提交之前做result.getAnyList().size();,它会一直加载,如果我使用HQL它完美无缺。 (但它不是应该如何工作(让它在使用时打开并加载),createAlias应该一如既往地正常工作)

看起来DetachedCriteria的createAlias没有获取给定的路径(在这种情况下是characterEnList

@EDIT
我发现如果我在所需的路径中使用setFetchMode(在这种情况下为characterEnList),则提取有效,但如果我使用createAlias(像往常一样)它只是停止工作,我不会知道如何,可能是一个hibernate bug或者其他东西,无论如何,我会等待有人回答,也许有人有同样的问题......

2 个答案:

答案 0 :(得分:0)

仅在事务期间访问时才加载延迟。因此,您必须在事务期间调用延迟加载的字段,以便hibernate获取它。然后它将在视图中显示。

或当然让它急切。

答案 1 :(得分:0)

发现如下问题:https://hibernate.atlassian.net/browse/HHH-7842 这可能是一个错误,如果我要求它是别名的内部联接,它应该是,我可以用HQL做到这一点,为什么我不能用Criteria做什么?

所以,现在我将不得不使用LEFT_OUTER_JOIN类型来解决这个问题,或者根本不使用别名(如果我不需要进行where子句或2深度提取)

希望对某人有所帮助,谢谢你的帮助!

示例

dc.createAlias(fetch, fetch, JoinType.LEFT_OUTER_JOIN);

OR

dc.setFetchMode(fetch, FetchMode.JOIN);