9

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

休眠查询 - 如何选择那些所有孩子都匹配一个值的父母?

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

我想选择那些所有孩子都是金发或红发的父亲。如果只有一个是黑发的,则不会选择父亲。

我已经尝试了对上述问题的答案的各种改编,比如......

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 编写它的任何其他方式,但我也不是那里的专家。有没有更有效的方法来实现这一点?

4

2 回答 2

6

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

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

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

于 2013-03-21T04:55:02.353 回答
0

尝试使用子查询。

select p from parent where parent.children.haircolor IN ('blonde','redhead') and p not in (select p from parent where parent.children.haircolor not IN ('blonde','redhead'))

于 2019-05-03T14:51:22.597 回答