У меня есть три класса, как эти:CriteriaQuery подзапрос с максимальной
Class A {
Long id;
Date d;
String e;
}
Class B {
Long id;
}
Class AB {
Long aId;
Long bId;
}
И я Havet о построить CriteriaQuery для достижения следующих:
select distinct(b.id) from b b
inner join ab ab on ab.bid = b.id
inner join a a on a.id = ab.aid
where e = 'SOMETHING'
and a.d in (
select max(aa.d)
from a aa
inner join ab aabb on aa.id = aabb.aid
inner join b bb on bb.id = aabb.bid
where bb.id = b.id
)
Но я что-то не хватает, потому что с:
List<Predicate> predicates = new ArrayList<Predicate>();
Join<B, A> joinAB = root.join("a", JoinType.INNER); // root is Root<B>
Subquery<A> sqA = query.subquery(A.class); // query is CriteriaQuery
Root<A> rootSqA = sqA.from(A.class);
sqA.select(builder.max((Expression)rootSqA.get("d")));
sqA.where(builder.and(joinAB.get("id").in(rootSqA.get("id))));
predicates.add(builder.in(sqA).value((Expression)joinAB.get("d")));
predicates.add(builder.equal(joinAB.get("e"), "SOMETHING"));
Я не получаю то, что хочу. Я думаю, что я получаю все объекты C (со своим последним объектом A), которые в какой-то момент имели объект A с e = «SOMETHING». Но я хочу, чтобы все объекты C имели свой последний объект A с e = «SOMETHING».