2010-05-21 75 views
7

此问题与this one非常相似,但对这个问题的回答是最小的。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); 

“阿富汗国家发展战略”是一个“值”字段是一个字符串的实体集。 “criteria()”为父类创建一个标准。 “list()”只是调用criteria.list();

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

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

回答

0

那不应该是连词?

+0

嗨, 它需要一个析取,因为我要选择父那里集合中的所有元素都喜欢的方式字符串a或字符串b或字符串c。等等。 – 2010-05-23 16:44:37

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(由于没有在标准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)) 

但是,据我了解,这两个查询不能在标准API表示(你不能在子查询中写from p.ands,不能使用in elements)。所以,在标准的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) 
+0

谢谢你。只是探索其可能性。也许HQL在这里会更好,但我无法理解elements()子句。我可以以某种方式使用所有元素(parent.ands)吗? – 2010-05-23 16:46:34

+0

@Andrew:编辑 – axtavt 2010-05-23 17:34:35

+0

啊 - 很酷。这按预期工作。非常感谢。现在只关心表现。 – 2010-05-23 19:24:46

相关问题