简体   繁体   English

如何进行 JPQL 子查询?

[英]How do I do a JPQL SubQuery?

It is possible to do the equivalent of this sql query in JPQL?可以在 JPQL 中执行与此 sql 查询等效的操作吗?

SELECT * 
 FROM COUNTRIES c WHERE COUNTRY_ID IN (
  SELECT DISTINCT COUNTRY_ID 
   FROM PORTS p 
   WHERE p.COUNTRY_ID = c.COUNTRY_ID AND STATE = 'A'
) 

You need to test it with IN and subquery since both do work in JPQL (according to syntax reference they do work together). 您需要使用IN子查询对其进行测试,因为它们都可以在JPQL中工作(根据语法参考,它们可以一起工作)。 You may also look at MEMBER OF expressions . 您还可以查看MEMBER OF表达式

But there is a better approach in my opinion. 但在我看来,有更好的方法。 Such queries are called correlated sub-queries and one can always re-write them using EXISTS: 此类查询称为相关子查询,可以使用EXISTS重写它们:

SELECT * FROM COUNTRIES c WHERE 
EXISTS (
        SELECT 'found' FROM PORTS p 
        WHERE p.COUNTRY_ID = c.COUNTRY_ID AND STATE = 'A'
) 

JPQL supports EXISTS with subqueries . JPQL支持带有子查询的EXISTS

Yes, It is possible to use subquery with IN operator in JPQL.是的,可以在 JPQL 中使用带有IN运算符的subquery I had a similar usecase and it worked for me.我有一个类似的用例,它对我有用。 My query was as follows.我的查询如下。

@Query("SELECT g FROM Group g WHERE g.id IN (SELECT DISTINCT m.groupId FROM Member m WHERE m.id IN (?1))")
List<Group> findAllGroupsOfMembers(List<BigInteger> memberIds);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM