0

会社とユーザーとして2つのエンティティがあります。

ユーザー --> ManyToOne --> 会社

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

これで、この SQL を以下の 2 つの方法で記述できます

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 にロードされますか? Company Object は休止状態のセッションにロードされますか?

4

1 に答える 1

1

どちらのクエリも、セッションで見つかったユーザーを読み込みます。ManyToOne アソシエーションが熱心に読み込まれる場合 (デフォルトでは true)、各ユーザーの会社もセッションに読み込まれます。遅延として構成されている場合、会社はセッションに読み込まれません。

最初のクエリは基準クエリであるのに対し、2 番目のクエリは 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 に答える