16.4. 関連
createCriteria()を利用し関連を遷移することで、関連エンティティの制約を指定できます:
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%") )
.createCriteria("kittens")
.add( Restrictions.like("name", "F%") )
.list();
2番目の
createCriteria() は、kittens コレクションの要素を参照する新しい Criteria インスタンスを返します。
特定の状況において有用な方法もほかにあります:
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add( Restrictions.eqProperty("kt.name", "mt.name") )
.list();
(
createAlias() は新しい Criteria インスタンスを作成しません。)
前の2つのクエリが返す
Cat インスタンスにより保持される kittens コレクションは、criteria によって事前にフィルタリング されません。criteria と一致する kitten を取得したい場合、 ResultTransformer を使わなければなりません。
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Restrictions.eq("name", "F%") )
.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Cat kitten = (Cat) map.get("kt");
}