0

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

用户 --> 多对一 --> 公司

SQL select * from user where companyid in (select companyid from Company where companyName = 'Company1')

现在我可以用以下两种方式编写这个 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();

这里的问题是休眠会话中将加载多少对象?公司对象是否会被加载到休眠会话中?

4

1 回答 1

1

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

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

Criteria criteria = session.createCriteria(User.class, "user");
criteria.createAlias("user.company", "company");
criteria.add(Restrictions.eq("company.name", theCompanyName));
return criteria.list();
于 2012-11-26T12:37:30.623 回答