предположим, у меня есть 3 таблицы GrandCat, Cat и Kitt. они имеют отношение один ко многим, поэтому у меня есть следующие классы. вся ассоциация ленивая загрузка.
GrandCat{
int age;
Set<Cat> cats;
}
Cat{
int age;
Set<kitt> kitten;
GrandCat grandCat;
}
Kit{
String color;
Cat cat;
}
Я хочу построить список grandCat. условие: grandCat.age> 10 и Cat.age> 5 и имеет по крайней мере один котенок, цвет которого желтый. и когда я выполняю grandCat.getCats (), только кошки удовлетворяют условию возврата. Например, у меня есть следующие кошки.
отношение как это
grand 1(age>10)--> alex(age>5) ---> a(yellow),b,c |
|
--> bob(age<5) --->d,e(yellow)
grand 2(age>10) --> charlie(age<5) ---> f,g(yellow)
|
--> david(age>5)--->h
|
-->edward(age>5)-->j(yellow)
|
-->fay(age>5) --> i(yellow),k(yellow)
other grandCats........
Я хочу, чтобы GrandCats возвращался как grand 1 и grand2 вот так
grand1-->alex-->a
grand2-->edward-->j
|
-->fay-->i,k
это миллионы внуков, кошек и котят, поэтому не нужно загружать их, а затем фильтровать.
Я знаю, что могу достичь этого, используя
select g,c,k from grandCat g inner join fetch g.cat c inner join fetch c.kitten k where g.age>10 and c.age>5 and k.color='yellow'.
и затем зациклите возвращаемое значение, чтобы увидеть, какой кот принадлежит к какому grandCat, а котенок - к коту. но у этого есть некоторый недостаток, есть дубликаты на уровне кошки и дедушки. потому что они вернулись как
grand1-->alex-->a
grand2-->edward-->j
grand2-->fay-->i
grand2-->fay-->k
поэтому мне нужно сравнить их и отфильтровать, когда есть много записей, это занимает время и потребляет ресурсы.
у кого есть хороший способ загрузить это? я должен использовать 3 hql? сначала получите соответствие grandCat1 и grand2
select g from grandCat g inner join fetch g.cat c inner join fetch c.kitten k where g.age>10 and c.age>5 and k.color='yellow'.
затем запросите кота, используя grandcat, возвращенный из последнего запроса, а затем поместите кота в grand.setcats ()
select c from Cat c inner join fetch cat.grandCat g inner join fetch c.kitten k where g=:grandCat and c.age>5 and k.color='yellow'
затем запросить котенка и сделать то же самое?
select k from Kitt k inner join fetch k.cat c where c=:cat and k.color='yellow'
кажется утомительным.
каков наилучший способ сделать это? Между прочим, я надеюсь, что возвращенный grandCat и его 'кошка и котенок все еще имеют возможность ленивой загрузки, скажем, если у котенка есть какая-то другая ассоциация, я могу использовать их позже через ленивую загрузку.