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';