Jpa 需要将左连接转换为JPQL

Jpa 需要将左连接转换为JPQL,jpa,left-join,jpql,outer-join,migrate,Jpa,Left Join,Jpql,Outer Join,Migrate,出现以下问题: 有人想买一篮水果,里面有来自非洲和南美的绿色水果,但没有来自非洲的红色水果 为此,我们考虑以下课程: class Basket { int id; Collection<Fruit> fruits; } class Fruit { int id; int basketId; String origin Color color; } JPQL中的

出现以下问题: 有人想买一篮水果,里面有来自非洲和南美的绿色水果,但没有来自非洲的红色水果

为此,我们考虑以下课程:



    class Basket
    {
      int id;
      Collection<Fruit> fruits; 
    }

    class Fruit
    {
      int id;
      int basketId;
      String origin
      Color color;
    }

JPQL中的查询是什么

我已经试过了:



    SELECT b 
    FROM Basket b 
    WHERE 
      b.id IN (
        SELECT f1.basketId FROM Fruit f1 
        WHERE f1.color='green' AND (f1.origin='Africa' OR f1.origin='South America')
      ) AND
      b.id NOT IN (
        SELECT f2.basketId FROM Fruit f2 
        WHERE f2.color='red' AND (origin='Africa'))

但是这个查询用了12000ms而不是50ms。 (这只是一个简单的例子。真正的桌子上有大约750000个“水果”和10000个“篮子”,每个都有更多的字段。)

提前谢谢

杰拉尔德

你可以试试

select b from Basket b where
    exists (select f.id from Fruit f where f.basket = b and f.color = 'green')
    and not exists (select f.id from Fruit f where f.basket = b and f.color = 'red')
但我不确定它会更快。它取决于执行计划,执行计划取决于数据库索引。应该在
水果.basketId
水果.color
上有一个索引,这样行吗

select b from Basket b join b.fruits f where f.color = 'green' and not f.color = 'red';
连接可能是可选的,因此也可以是

select b from Basket b where b.fruits.color = 'green' and not b.fruits.color = 'red';

子选择已从先前的查询中很好地索引。我将索引添加到“basketId”,但它仍然需要很长时间…:-/我认为EXISTS的工作原理与IN.hmm类似,我认为我需要扩展这个示例。。。在水果类中有一个额外的字段“stringorigin”,你想要非洲和南美的绿色水果,而不是非洲的红色水果;PostgreSQL:a=144秒对b=62秒;H2:a=77s对b=1817s
select b from Basket b where b.fruits.color = 'green' and not b.fruits.color = 'red';