Представьте, что у меня есть 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);