Я пишу запрос с использованием JPA Criteria API, где я хочу получить все путешествия, соответствующие любому из этих предикатов:
- Получить все путешествия (MasterTravels), которыми я владею (владелец = пользователь)
- Получить все поездки, где я являюсь пассажиром (Пассажир, пользователь = пользователь)
- Получить все путешествия, на которые я подал заявку (MasterTravelApplication, user = user)
Первый предикат прост. Я просто проверяю, если владелец = пользователь в MasterTravel. Для второго предиката мне нужно присоединиться к MasterTravel->MTT->Travel->Passenger, а затем проверить, если Passenger_.user = user. Для третьего предиката мне нужно присоединиться в другом направлении MasterTravel->MasterTravelApplication и проверить наличие MasterTravelApplication_.user = user. Это то, что ломает мой запрос, так как у меня есть два первых рабочих, но когда я пытаюсь добавить последний предикат, он перестает работать.
Должен ли я создать новый корень для последнего объединения или как я могу использовать объединение объединений 1 и 2 ниже?
CriteriaQuery<MasterTravel> q = cb.createQuery(MasterTravel.class);
Root<MasterTravel> root = q.from(MasterTravel.class);
// Joins 1, these works fine
Join<MasterTravel, MTT> mtts = root.join(MasterTravel_.mtt);
Join<MTT, Travel> travels = mtts.join(MTT_.travel);
Join<Travel, Passenger> passengers = travels.join(Travel_.passengers);
// Joins 2, this doesn't work
Join<MasterTravel, MasterTravelApplication> application = root.join(MasterTravel_.applications);
Predicate p = cb.or(
cb.equal(passengers.get(Passenger_.user), user),
cb.equal(root.get(MasterTravel_.owner), user),
cb.equal(application.get(MasterTravelApplication_.user), user)); // When I add this it stops working
q.select(root);
q.where(p);
q.orderBy(cb.desc(root.get(MasterTravel_.createdTimestamp)));
q.distinct(true);
List<MasterTravel> resultList = em.createQuery(q).getResultList();