次の 2 つのテーブル (Cats with Kittens) があるとします。
==== Cat.java ====
@Id @GeneratedValue( strategy = GenerationType.IDENTITY )
private long id;
@Column( unique = true, nullable = false )
private String name;
@OneToMany @JoinColumn( name = "cat_id" )
private List<Kitten> kitten;
==== Kitten.java ====
@Id @GeneratedValue( strategy = GenerationType.IDENTITY )
private long id;
@Column( unique = true, nullable = false )
private String name;
次のデータで
Cat(id, name)
Cat(1, "Cat 1")
Cat(2, "Cat 2")
Kitten(id, cat_id, name)
Kitten(1, 1, "Kitten 1")
Kitten(2, 1, "Kitten 2")
Kitten(3, 2, "Kitten 3")
Kitten(3, 2, "Bad Kit")
ここで、名前に「kitten」が含まれる子猫を飼っているすべての猫を見たいと思います。
list = sess().createCriteria( Cat.class ).createAlias( "kitten", "kitten" )
.add( Restrictions.like( "kitten.name", "%kitten%" ) ).list();
前のコマンドは、結合により重複したエントリが取得され、たとえば count と maxresult が機能しないため、あまり適切ではありません。これは十分に文書化された問題であり、代わりにサブクエリを使用することが言及されています。
私はこのようなことを考えています(ただし、Criteria-Apiを使用):
from Cat where id in
(select cat_id from Kitten where name like '%kitten%')
休止状態では「cat_id」へのアクセスが許可されず、このクエリだけで双方向にしたくないため、これは機能しません。