Я новичок в JPA и столкнулся с проблемой понимания одного конкретного запроса.Я переписал в CriteriaQuery, но результат и запрос, переведенный в SQL, неверны.
Фоновая ситуация: у меня есть таблица транзакций магазина (перемещений), и текущая сумма в магазине определяется каксумма всех изменений.Теперь я хочу выбрать и отобразить последние ходы, поскольку они также содержат информацию о полученной сумме в магазине.
Итак, это запрос в JPQL:
SELECT m FROM move m WHERE m.id = (
SELECT MAX(o.id) FROM move o WHERE (o.item = m.item AND m.cell.store = :s)
Я пыталсяпереписать его в следующий CriteriaQuery:
CriteriaBuilder builder = model.getCriteriaBuilder();
CriteriaQuery<Move> query = builder.createQuery(Move.class);
Root<Move> root = query.from(Move.class);
Subquery<Long> subquery = query.subquery(Long.class);
Root<Move> subroot = subquery.from(Move.class);
subquery.select(builder.max(subroot.get("id").as(Long.class)));
subquery.where(builder.and(
builder.equal(
subroot.get("item").get("id"),
root.get("item").get("id")),
builder.equal(
subroot.get("cell").get("store").as(Store.class),
store)));
Expression<Boolean> where = builder.equal(
root.get("id"),
subquery);
query.where(where);
return model.getList(query);
Получен неверный SQL-запрос:
SELECT t0.id, (...) FROM move t0 WHERE (t0.id = (
SELECT MAX(t1.id) FROM item t3, item t2, move t1
WHERE (((t2.id = t3.id) AND
(t1.cell_store = ?)) AND
((t2.id = t1.item_ref) AND
(t3.id = t0.item_ref))))
)
Я не понимаю, почему в подзапросе есть двойное перекрестное соединение.Спасибо за помощь!