JPA Query - JPQL用于选择具有所有子项且具有一组值的属性的父项

时间:2013-03-21 04:33:34

标签: jpa one-to-many jpql

我正在尝试编写一个JPQL查询来返回实体,其中所有实体的子项都具有一组值中的属性。它类似于以下问题,但有多个可能的值:

Hibernate query - How to select those parents that have ALL the children matching a value?

这是一个改编自上述问题的实际例子......

我想选择那些拥有所有孩子的金发或红头发的父亲。如果只有一个是黑头发的父亲没有被选中。

我已尝试对上述问题的答案进行各种调整,例如......

select p from parent where all(parent.children.haircolor) IN ('blonde','redhead')

select p from parent where parent.children.haircolor ALL IN ('blonde','redhead')

没想到那些人会工作,但值得一试。到目前为止,只有一件事有效......

select p from parent 
where 0 = (select count(c) from p.children c 
              where c.haircolor NOT IN ('blonde','redhead')
          )

我真的不想为每一行运行这样的计数查询,但我没有看到更好的机制。这并不让我感到惊讶,因为我无法想到用纯SQL编写这个的任何其他方法,但我也不是那里的大师。有没有更有效的方法来实现这一目标?

2 个答案:

答案 0 :(得分:3)

您尝试在看起来像集合属性的内容上使用JPQL路径表达式 - 您不能这样做。而是像这样做一个连接:

SELECT p FROM Parent p JOIN p.children c WHERE c.haircolor IN :hairColorCollection

上面,Parent被假定为具有集合值属性children的实体,其中每个目标实体都具有单值haircolor属性。 :hairColorCollection是一个参数,应该在执行查询之前设置为集合对象。

答案 1 :(得分:0)

尝试使用子查询。

从parent.parent.children.haircolor IN('blonde','redhead')中选择p,而不选择p(从parent.parentren.children.haircolor不IN('blonde','redhead')中选择p