Выбор всех объектов со свойствами, соответствующими другой коллекции объектов в JPA - PullRequest
0 голосов
/ 24 апреля 2019

Представьте, что у меня есть 3 объекта JPA:

EntityA с полем b типа EntityB

EntityB с полем x типа String

EntityC с полем bs типа List<EntityB>

Я хочу запросить строковый параметр, скажем, foo.Тогда мне нужно найти EntityC, где любое bs.x равно foo.В конце мне нужны все элементы EntityA, где b.x равно любому из EntityC bs списка String значения x.

Я мог бы достичь этого двумя запросами, но мне нужно только значение EntityA, поэтому я хотел бы вместо этого сделать вложенное.

Можно ли сделать в API критериев запрос сподзапросы проще?

edit

Добавление моего решения, если оно кому-нибудь понадобится

//specific EntityB subquery
Subquery<Long> entityCSubquery = criteriaQuery.subquery(Long.class);
Root<EntityC> fromEntityCSpecific = entityCSubquery.from(EntityC.class);
Join<EntityC, EntityB> joinedSpecificEntityB = fromEntityCSpecific.join("bs", JoinType.INNER);
entityCSubquery.select(fromEntityCSpecific.get("id"));
entityCSubquery.where(cb.equal(joinedSpecificEntityB.get("x"), requestedX));

//connected EntityB subquery
Subquery<Long> matchingEntityBSubquery = criteriaQuery.subquery(Long.class);
Root<EntityC> fromEntityCConnected = matchingEntityBSubquery.from(EntityC.class);
Join<EntityC, EntityB> joinedConnectedEntityB = fromEntityCConnected.join("bs", JoinType.INNER);
matchingEntityBSubquery.select(joinedConnectedEntityB.get("id"));
matchingEntityBSubquery.where(fromEntityCConnected.get("id").in(entityCSubquery));

//predicate for main EntityA query
Predicate entityAPredicate = fromEntityA.get("b").get("id").in(matchingEntityBSubquery);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...