Преобразование запроса Postgres в JPQL

#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 аргумент.