JPQL中的成员未翻译成SQL exists子句

时间:2016-02-21 19:28:57

标签: mysql hibernate jpa innodb spring-data-jpa

为什么JPQL中的成员被翻译为:(?IN(select ...))

我在JPQL中创建了以下查询:

select  si
    from  ShoppingItem si
    join  si.owner u
    where  u = :owner
      and  :following member of u.followers" 

上述查询已翻译成:

select  shoppingit0_.id ...
    from  shopping_item shoppingit0_
    inner join  user user1_ on shoppingit0_.owner_id=user1_.id
    where
       and  user1_.id=?
      and  **(? IN (
                SELECT  followers2_.id
                    from  following followers2_
                    where  user1_.id=followers2_.target_id)
             )** ... 

我的技术堆栈:Spring Data JPA,hibernate,InnoDB引擎,MySQL DB ......

正如您所看到 成员正在进行"翻译"进入(? IN (从以下followers2_中选择followers2_.id,其中user1_.id = followers2_.target_id))

MySQL reference提供了优化" in"的建议。带有"存在"的子查询查询。
我的问题是:为什么会员被翻译成?在(选择...)而不是存在选择(...)

是否有可能告诉hibernate使用"存在"而不是"在"在这种情况下?

1 个答案:

答案 0 :(得分:1)

您可以尝试以下查询:

select  si
from  ShoppingItem si
join  si.owner u
where  u = :owner
  and exists (select f from Following f where f.target = u and f = :following )