我有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中将加载多少个对象? 公司对象是否会加载到休眠会话中?
答案 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();