представьте себе следующую проблему: кто-то хочет купить корзину с фруктами, содержащими зеленые фрукты из Африки и Южной Америки, но без красных фруктов из Африки.
, для этого мы думаем о следующих классах:
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'))
, но этот запрос занял 12000мс вместо 50 мс.(Это простой пример. Реальные таблицы содержат около 750000 «фруктов» и 10000 «корзин» с гораздо большим количеством полей в каждом.)
Заранее спасибо
Джеральд