#postgresql #jpa #jpql
#postgresql #jpa #jpql
Вопрос:
У меня есть следующий запрос в Postgres:
SELECT *
from table1
LEFT OUTER JOIN table1.table2 ON table1.latest_id = table2.id
WHERE table1.table2.status = 0
AND table1.id NOT IN (
(SELECT id from table3 where userId = table2.user))
У меня нет возможности объединить table1 и table3, и я застрял при написании подзапроса в формате, понятном JPA — работа с приложением spring boot. Вот где я добрался до сих пор в моем классе репозитория:
@Query("SELECT c FROM #{#entityName} c JOIN FETCH c.table2 WHERE c.table2.status = 0")
fun findByIdAndStatus(id: String): MyEntity
Я попытался выполнить подзапрос следующим образом, но безрезультатно — есть явная синтаксическая ошибка, с которой я не могу разобраться:
@Query("SELECT c FROM #{#entityName} c JOIN FETCH c.table2 WHERE c.table2.status = 0" AND c.id NOT IN ("
"SELECT * FROM Table3 WHERE userId = c.table2.user")
Вы можете помочь?
Спасибо
Ответ №1:
Предполагая:
- ваш SQL-запрос не использует никаких входных аргументов
- таблица 1 отображается с помощью
MyEntity
, а таблица 3 отображается с помощьюTable3
объекта - объект, связанный с таблицей 2, отображается в столбце объединения
MyEntity
с помощьюlatest_id
- статус отображается в виде числа (т. Е. Длинного / целого)
Вы можете переписать запрос в следующую форму JPQL:
@Query("SELECT t1 FROM MyEntity t1 "
"JOIN t1.table2 t2 "
"WHERE t2.status = 0 AND t1.id NOT IN ("
" SELECT t3.id from Table3 t3 "
" WHERE t3.userId = t2.user "
")")
List<MyEntity> findMyEntities();
Комментарии:
1. Спасибо за ваш ответ. На самом деле я использую входные аргументы, которые t1.id . Как это повлияет на мой запрос JPQL?
2. В таком случае вам просто нужно добавить во внешнее
where
условие дляt1.id = :identifier
и изменить сигнатуру метода, добавивLong identifier
аргумент.