以下是我的标准:
public Commercial findManager(Entity entity) {
DetachedCriteria criteria2 = DetachedCriteria.forClass(Role.class);
criteria2.createAlias("workStation", "workStation");
criteria2.createAlias("workStation.entity", "entity");
criteria2.add(Restrictions.eq("entity.id", entity.getId()));
criteria2.createAlias("commercial", "commercial", CriteriaSpecification.LEFT_JOIN);
criteria2.setFetchMode("commercial", FetchMode.JOIN);
criteria2.createAlias("commercial.function", "function");
criteria2.add(Restrictions.eq("function.name", "MANAGER"));
criteria2.setProjection(Projections.property("commercial"));
Commercial commercial = (Commercial) getHibernateTemplate().findByCriteria(criteria2).get(0);
return commercial;
}除了返回代理之外,此标准的工作原理是正常的。由于我将在该代理上查询许多属性,所以我希望强制hibernate在同一个查询中加载该对象,但即使在JOIN模式下,它似乎也不起作用。怎么啦?
我使用hibernate 3.3.2和Spring2.5
发布于 2016-02-19 09:55:41
多亏了Dragan,我才发现代理实际上已经初始化了。这实际上是对我在JDBC日志和调试器中看到的错误的解释。
我看到了这个:

但是,当深入研究它时,我发现数据就在那里,在控制台中记录数据不会触发对数据库的新调用:

经过更多的调查,我发现实际上不需要原始请求中的FetchMode.JOIN和CriteriaSpecification.LEFT_JOIN来获得这个结果。但是Adress字段是一个复杂的对象,它没有被初始化,并且对其属性进行查询会生成对数据库的新请求。然后我尝试添加下面的一行,现在它就像一个魅力(就像在前面的屏幕截图中,我们可以看到adress字段是一个代理)
criteria2.setFetchMode("commercial.adresse", FetchMode.JOIN);https://stackoverflow.com/questions/35488843
复制相似问题