假设我有以下两张桌子(猫和小猫):
==== 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")
现在我想看看所有有一只小猫的猫,它的名字包含“小猫”。
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%')
这不起作用,因为hibernate不允许我访问“cat_id”,我不想让它仅仅为了这个查询是双向的。