Hibernate条件查询以匹配所有子集合元素

时间:2010-05-21 21:29:51

标签: java hibernate

这个问题与this one非常相似,但对这个问题的回答很少。

我有一个带有一组子实体的父类。子实体只是字符串的包装器,并且与父实体位于不同的表中。我希望有一个条件查询,当子实体集的所有成员都返回true时,返回父实体。此条件与字符串列表中的一个匹配。我就在这里:

Criteria c = criteria();
Criteria ands = c.createCriteria("ands");
Disjunction dis = Restrictions.disjunction();
for (String value : values) {
    dis.add(Restrictions.like("value", "%" + value + "%"));
}
ands.add(dis);
return list(c);

“ands”是具有“value”字段的实体集,该字段是字符串。 “criteria()”为父类创建标准。 “list()”只调用criteria.list();

这只是与任何元素匹配,而不是全部。

希望这是有道理的。任何帮助非常感谢。

2 个答案:

答案 0 :(得分:3)

作为理论练习,您可以这样做:

Criterion condition = ...;

Criteria c = s.createCriteria(Parent.class, "p");
DetachedCriteria dc = DetachedCriteria.forClass(Parent.class, "p2")
    .createCriteria("ands", "c")
    .add(Restrictions.not(condition))
    .add(Property.forName("p.id").eqProperty("p2.id"))
    .setProjection(Projections.id());

c.add(Subqueries.notExists(dc));

但是,这种方法不适合实际使用,因为它需要额外的join(由于Criteria API中缺少in elements子句)。另请注意,它使用双重否定(SELECT ... WHERE NOT EXISTS (SELECT ... WHERE NOT <condition>)),因此可能会遇到NULL s的问题。

编辑:在HQL中,可以这样写:

from Parent p
where not exists (select c from p.ands c where not <condition>)

from Parent p
where not exists (select c from Child c 
    where not <condition> and c in elements(p.ands))

但是,据我所知,两个查询都无法在Criteria API中表达(您不能在子查询中编写from p.ands并且不能使用in elements)。因此,在Criteria API中,您必须使用其他连接(注释2 Parent s):

from Parent p
where not exists (select c from Parent p2 join p2.ands c 
    where not <condition> and p = p2)

答案 1 :(得分:0)

这种脱节不应该是一种结合吗?