Inner join двух одинаковых таблиц в criteria api Java

У меня есть таблица store_position и cost_dynamic. store_position хранит id продукта и id магазина. cost_dynamic - цену на позицию, привязанную к дате. Текущую цену на позицию получать надо примерно так - берём строку из cost_dynamic с максимальной датой именно для данной позиции. Пришлось немного помучаться с SQL чтобы соотносить id store_position с текущей стоимостью, получилось так:

select id, t1.mx, t2.cst 
from store_position
inner join (
    select position_id, MAX(cost_date) as mx
    FROM cost_dynamic
    GROUP BY position_id
) as t1 ON id = t1.position_id
inner join (
    select position_id as p2, cost as cst, cost_date as cstdt2
    FROM cost_dynamic
) as t2 ON t1.position_id = t2.p2 and t1.mx = t2.cstdt2;

Т.е получаю макс. дату для позиции в cost_dynamic, а потом окольными путями через ещё один джойн нахожу полную строку с макс. датой. А теперь самый главный вопрос - как это перевести на JPA Criteria? Честно говоря я даже как то не очень уверен возможно ли это, пытался пока попробовать, но получилось что-то непонятное :)

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> query = builder.createTupleQuery();
Root<Position> root = query.from(getEntityClass());
query.multiselect(root.get(Position_.product));
Join<Position, CostDynamic> join1 = root.join(Position_.costDynamics);
join1.on(builder.equal(root.get(Position_.id), join1.get(CostDynamic_.position)));
Join<Position, CostDynamic> join2 = root.join(Position_.costDynamics);
join1.on(builder.and(builder.equal(join1.get(Position_.id), join2.get(CostDynamic_.position)), builder.equal(join2.get(CostDynamic_.costDate), join1.get(CostDynamic_.position))));

Интуитивно чувствую, что работать не будет :). Может, кто-нибудь страдал подобным ("склеивание" 2ух одинаковых таблиц) и у кого-то есть нормальный пример как это сделать?


Ответы (0 шт):