Detached Criteria查询对象是否已加载到Hibernate会话中?

时间:2012-11-26 11:28:17

标签: hibernate

我有2个实体作为公司和用户。

用户 - > ManyToOne - >公司

SQL 从userid in user中选择*(从company name ='Company1'的公司中选择companyid)

现在我可以用以下两种方式编写这个SQL

1)使用分离标准

     DetachedCriteria subCriteria = DetachedCriteria.forClass(Company.class);
     subCriteria.add(Restrictions.eq(" companyName ", companyName));
     subCriteria.setProjection(Property.forName("companyid") );

     Criteria criteria = session.createCriteria(User.class);
     criteria.add(Subqueries. propertyIn("companyid", subCriteria));
     criteria.list();

2)使用标准

 session.createQuery("From User u Where u.company.name like 'Company1'").list();

问题是在hibernate Session中将加载多少个对象? 公司对象是否会加载到休眠会话中?

1 个答案:

答案 0 :(得分:1)

两个查询都会在会话中加载找到的用户。如果急切地加载ManyToOne关联(默认情况下为true),则每个用户的公司也将加载到会话中。如果它被配置为懒惰,则会话中不会加载任何公司。

请注意,第一个查询是条件查询,而第二个查询是HQL查询(而不是您所说的Criteria查询)。第一个查询也太复杂了。您不需要任何子查询(如HQL查询所示)。你可以简单地做

Criteria criteria = session.createCriteria(User.class, "user");
criteria.createAlias("user.company", "company");
criteria.add(Restrictions.eq("company.name", theCompanyName));
return criteria.list();