次の問題を想像してみてください。誰かが、アフリカと南アメリカからの緑の果物が入った果物のバスケットを購入したいと考えていますが、アフリカからの赤い果物はありません。
そのために、次のクラスについて考えます。
class Basket
{
int id;
Collection<Fruit> fruits;
}
class Fruit
{
int id;
int basketId;
String origin
Color color;
}
マッピングは MxM になります。Fruit には Basket オブジェクトがないことを意図していますが、必要に応じて実装できます。
ネイティブ 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'))
しかし、このクエリには 50 ミリ秒ではなく 12000 ミリ秒かかりました。(これは単純な例です。実際のテーブルには、約 750000 個の「果物」と 10000 個の「バスケット」があり、それぞれより多くのフィールドがあります。)
前もって感謝します
ジェラルド