我有一个简单的查询,工作了很长时间,现在我在我的代码中改变了一些东西:
(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或者其他东西,无论如何,我会等待有人回答,也许有人有同样的问题......
答案 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);