1

假设我有以下两张桌子(猫和小猫):

==== 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”,我不想让它仅仅为了这个查询是双向的。

4

2 回答 2

2

如果您只是添加一个投影来获取猫 ID,那么您的查询就是您要使用的子查询。所以你只需要以下内容:

DetachedCriteria acceptedCatIds = DetachedCriteria.forClass(Cat.class);
acceptedCatIds.createAlias("kitten", "kitten")
              .add(Restrictions.like("kitten.name", "%kitten%" ))
              .setProjection(Projections.id());

Criteria acceptedCats = session.createCriteria(Cat.class)
acceptedCats.add(Subqueries.propertyIn("id", acceptedCatIds));
于 2013-09-15T18:33:25.517 回答
0

我强烈建议您也让 Kitten 包含对 Cat 的引用。虽然需要更多的关注来保持小猫和猫双方的关系一致,但这是值得的。

class Cat {

    @Id @GeneratedValue( strategy = GenerationType.IDENTITY ) 
    private long id;

    @OneToMany(mappedBy="parent")
    private List<Kitten> kitten;
}

class Kitten {

    @Id @GeneratedValue( strategy = GenerationType.IDENTITY ) 
    private long id;

    @Column( unique = true, nullable = false )
    private String name;

    @ManyToOne
    @JoinColumn( name = "cat_id" )
    private Cat parent;
}

HQL 应该变得和您想要的一样简单:

from Cat c where c in
(select parent from Kitten where name like '%kitten%')

甚至

select distinct parent from Kitten where name like '%kitten%'
于 2013-09-16T03:33:43.403 回答