【发布时间】:2011-09-15 16:02:30
【问题描述】:
想象以下问题: 有人想买一篮子水果,里面有非洲和南美洲的绿色水果,但没有非洲的红色水果。
为此,我们考虑以下类:
class Basket
{
int id;
Collection<Fruit> fruits;
}
class Fruit
{
int id;
int basketId;
String origin
Color color;
}
映射将是 MxM。 Fruit 没有 Basket 对象,但如有必要,我可以实现它。
对于 Native SQL,我会使用:
SELECT *
FROM
Basket b
JOIN
(
SELECT DISTINCT basketId
FROM Fruit
WHERE color='green' AND (origin='Africa' OR origin='South America')
) f1 ON (b.id=f1.basketId)
LEFT JOIN
(
SELECT DISTINCT basketId
FROM Fruit
WHERE color='red' AND (origin='Africa')
) f2 ON (b.id=f2.basketId)
WHERE f2.basketId IS NULL
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'))
但是这个查询需要 12000 毫秒而不是 50 毫秒。 (这只是一个简单的例子。真正的表格有大约 750000 个“水果”和 10000 个“篮子”,每个都有更多的字段。)
提前致谢
杰拉德
【问题讨论】:
-
到目前为止我发现了什么:基准平均查询时间(10000 次查询):a)标准 SQL(左连接)vs b)JPQL(存在):MySQL:a=60s vs b=1050s; PostgreSQL:a=144s vs b=62s; H2:a=77s vs b=1817s
标签: jpa left-join jpql outer-join migrate