Hibernate标准查询以匹配所有子集合元素
这个问题与这个问题非常相似,但是对这个问题的回答很少。
我有一个父类与一组子实体。 子实体只是一个字符串的包装,并且与父实体位于不同的表中。 我想有一个标准查询,当子组实体的所有成员都返回一个条件时返回父实体。 此条件与字符串列表中的一个匹配。 这是我的位置:
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();
这只是匹配任何元素,而不是全部。
希望这是有道理的。 任何帮助非常感谢。
作为理论练习,你可以做这样的事情:
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
的问题。
编辑:在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
):
from Parent p
where not exists (select c from Parent p2 join p2.ands c
where not <condition> and p = p2)
那不应该是一个连词吗?
链接地址: http://www.djcxy.com/p/955.html上一篇: Hibernate criteria query to match against all child collection elements