这是我的标准:
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模式下使用fetchmode它似乎也不起作用。有什么问题?
我使用hibernate 3.3.2和spring 2.5
答案 0 :(得分:2)
感谢Dragan,我发现代理实际上是初始化的。这实际上是对我在JDBC日志和调试器中看到的内容的错误解释。
我看到了这个:
但是当深入研究它时,我发现数据存在,并且在数据控制台中创建日志并不会触发对数据库的新调用:
经过一些调查后,我发现原始请求中的FetchMode.JOIN
和CriteriaSpecification.LEFT_JOIN
实际上并不需要获得此结果。但Adress字段是一个复杂的对象,未初始化,查询其属性会产生对数据库的新请求。然后我尝试添加以下行,现在它就像一个魅力(就像在前面的截图中我们可以看到地址字段是代理)
criteria2.setFetchMode("commercial.adresse", FetchMode.JOIN);