按集合属性筛选的Hibernate条件

按集合属性筛选的Hibernate条件,hibernate,criteria,Hibernate,Criteria,我使用hibernate的criteria子API来管理前端用户可以执行的动态查询。只要过滤完成,并且考虑到根实体(称为“根”)的属性,一切都很好,假设使用alias正确指定了关联路径 但我要执行一个复杂的查询,它涉及一个子对象的集合(我们将其类称为“child”)。我不仅要根据子对象属性的值来选择根实体(这可以做得很简单),还要深入检查该子对象(满足某些条件)是否符合另一个条件,而且只针对该子对象 因此,在更具体的示例中,让我们假设以下声明: class Root { Long id;

我使用hibernate的criteria子API来管理前端用户可以执行的动态查询。只要过滤完成,并且考虑到根实体(称为“根”)的属性,一切都很好,假设使用alias正确指定了关联路径

但我要执行一个复杂的查询,它涉及一个子对象的集合(我们将其类称为“child”)。我不仅要根据子对象属性的值来选择根实体(这可以做得很简单),还要深入检查该子对象(满足某些条件)是否符合另一个条件,而且只针对该子对象

因此,在更具体的示例中,让我们假设以下声明:

class Root {
    Long id;
    Collection<Child> childs;
}

class Child {
    Long id;
    ValueObject attr;
}

class ValueObject {
    String attribute;
}
但我不想匹配所有根对象,这些根对象包含一个id为20的子对象,而另一方面,它也包含另一个attr值为“foo”的子对象(不管是否相同)。我真正想要的是检索包含id为20且属性值为“foo”的子对象的所有根对象(所有这些限制都由同一实体子对象实现!)

我试图找到有关这方面的信息,但一切似乎都很模糊

如果有人能帮助我,我将非常感激

谢谢大家

你好


维克托。

关于这一点的任何成功或更新,@Victor?Hi@KevinMeredith,我承认这并不是解决问题的办法。相反,我用HQL重新格式化了查询,一切都很顺利!。看看这个。也许有帮助。。。
Criteria criteria = session.createCriteria(Root.class);
criteria.createAlias("childs","childs");
criteria.createAlias("childs.attr","attr_childs");
criteria.add(Restrictions.eq("childs.id",20L));
criteria.add(Restrictions.eq("childs.attr","foo"));