OR父子关联的Hibernate Criteria查询

时间:2014-01-17 17:19:59

标签: java hibernate hibernate-criteria

我正在使用Hibernate 3.5,我正在尝试进行搜索,该搜索将返回包含关键字的父对象,或者如果其中一个子对象包含关键字,则返回父项。

以下是使用Hibernate Documentation中的Cat的示例:

 @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();

这将仅返回Cat对象,其中父对象的名称以F开头,其中一只小猫的名称以F开头。我想创建一个查询以返回这些限制的逻辑分离。名字以F或Cats开头的猫,其小猫的名字以F开头。 示例:(猫:[小猫]) 弗里茨:[],弗兰克:[艾尔,巴里],查理:[弗兰];应该都包含在结果集中。 而鲍勃:[]和迈克:[艾伦,博斯科]不应该。

我尝试了一些不同的查询,但无法获得正确的结果。

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

此查询返回名称以F开头的所有Parent Cats。

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文档,则此查询与上一个查询相同。这是有道理的,因为我得到与前两个查询相同的结果。

通过标准搜索,我很难以获得正确的Cats集。

我想我可以运行两个单独的查询然后清理生成的集合,但这似乎是不必要的优雅。

任何建议表示赞赏。 喵。

1 个答案:

答案 0 :(得分: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%"));

这应该有效。