2014-01-17 80 views
2

我正在使用Hibernate 3.5,我试图做一个搜索,它将返回一个包含关键字的父对象,或者如果其中一个子对象包含一个父项,则返回一个父项关键词。休眠Critera查询OR父子关联

这里是使用Cat从Hibernate Documentation一个例子:

@Entity 
    @Table(name="cats") 
    public class Cat { 
     private String name; 
     private Set<Cat> kittens; 
    } 

下面是从Criteria Query部的示例查询:

Criteria criteria = session.createCriteria(Cat.class) 
    .add(Restrictions.like("name", "F%") 
    .createAlias("kittens", "kits") 
    .addRestrictions.like("kits.name", "F%"); 
List<Cat> cats = criteria.list(); 

这将只返回猫对象,其中的名称父母以F开头,并且其中一只小猫的名字以F开头。我想创建一个查询来返回这些限制的逻辑和。猫的名字以F开头,或猫的名字以F开头的小猫。 例子:(猫:[Kittens]) Fritz:[],Frank:[Al,Barry],Charlie:[Fran];应该都包含在结果集中。 虽然鲍勃:[]和迈克:[艾伦,博斯科]不应该。

我已经尝试了几个不同的查询,但一直无法获得正确的结果。

Criteria criteria = session.createCritera(Cat.class) 
    .add(Restrictions.like("name", "F%); 

该查询返回所有家长猫名称以F.

Criteria criteria = session.createCriteria(Cat.class) 
    .createAlias("kittens", "kits") 
    .add(Restrictions.like("kits.name", "F%"); 

该查询返回谁拥有小猫他的名字与F. 这是我的麻烦开始的地方开始的所有父猫,我需要这两套的分离。首先我试过:

Criteria.criteria = session.createCriteria(Cat.class) 
    .createAlias("kittens", "kits") 
    .add(Restrictions.disjunction() 
     .add(Restrictions.like("name", "F%") 
     .add(Restrictions.like("kits.name", "F%"); 

此查询不起作用。它仅返回子女姓名以F开头的父母,就像之前的查询一样。

Criteria.criteria = session.createCriteria(Cat.class) 
    .createAlias("kittens", "kits") 
    .add(Restrictions.or(
     Restrictions.like("name", "F%"), 
     Restrictions.like("kits.name", "F%")); 

如果我正确阅读API文档,则此查询与上一个查询相同。这是有道理的,因为我得到了与前两个查询相同的结果。

作为一种通过标准搜索得到正确的猫群结果的方式,我被难住了。

我想我可以运行两个单独的查询,然后清理结果集合,但似乎不必要的不​​雅。

任何建议表示赞赏。 喵。

回答

1

尝试:

Criteria.criteria = session.createCriteria(Cat.class) 
.createAlias("kittens", "kits", Criteria.LEFT_JOIN) 
.add(Restrictions.or(
    Restrictions.like("name", "F%"), 
    Restrictions.like("kits.name", "F%")); 

这应该工作。