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

Java Hibernate条件查询以匹配所有子集合元素,java,hibernate,Java,Hibernate,这个问题非常类似,但对这个问题的回答很少 我有一个带有一组子实体的父类。子实体只是字符串的包装器,与父实体位于不同的表中。我希望有一个条件查询,当子实体集的所有成员都将某个条件返回true时,该查询将返回父实体。此条件与字符串列表中的一个匹配。我就在这里: Criteria c = criteria(); Criteria ands = c.createCriteria("ands"); Disjunction dis = Restrictions.disjunction(); for (Str

这个问题非常类似,但对这个问题的回答很少

我有一个带有一组子实体的父类。子实体只是字符串的包装器,与父实体位于不同的表中。我希望有一个条件查询,当子实体集的所有成员都将某个条件返回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”是一组实体,其“值”字段为字符串。 “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));
from Parent p
where not exists (select c from p.ands c where not <condition>)
然而,这种方法不适合实际使用,因为它需要额外的
连接
(因为在标准API的元素子句中缺少
)。还请注意,它使用双重否定(
SELECT…WHERE NOT EXISTS(SELECT…WHERE NOT)
),因此它可能会遇到
NULL
s的问题

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

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));
from Parent p
where not exists (select c from p.ands c where not <condition>)

您好,它需要是析取,因为我想选择集合中每个元素都像字符串a、字符串b或字符串c的父元素。等等,谢谢你。只是在探索它的可能性。也许HQL在这里会更好,但我在理解elements()子句时遇到了困难。也许我可以使用所有元素(parent.ands)吗?啊,太酷了。这正如预期的那样有效。非常感谢。现在只关心性能。