Как обновить строку в таблице с условием — обратиться к другой таблице

#spring #database #hibernate #single-page-application

#весна #База данных #спящий режим #одностраничное приложение

Вопрос:

Как я могу обновить таблицу, условие которой ссылается на другую таблицу в spring jpa? У меня есть табличная задача, которая связана с TaskProgress (многие к одному). И TaskProgress имеет некоторое значение, например: CREATE, INPROGRES, DONE, ARCHIVED, … Вот мой запрос в репозитории:

 @Modifying
@Query("UPDATE Task t  SET t.responsibleUser = null WHERE t.responsibleUser.id = :userId "  
            "AND t.deleted = false AND t.taskProgress.name <> 'ARCHIVED'")
void removeResponsibleUserId(UUID userId);
 

Но я получил сообщение об ошибке:

 Hibernate: update task cross join  set responsible_user_id=null where responsible_user_id=? and deleted=0 and name<>'ARCHIVED'
2020-11-25 00:38:51 - SQL Error: 1064, SQLState: 42000
2020-11-25 00:38:51 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'set responsible_user_id=null where responsible_user_id=x'152B59C33A0035003500000' at line 1
 

Ответ №1:

Используйте предикат exists, подобный этому:

 @Modifying
@Query("UPDATE Task t  SET t.responsibleUser = null WHERE t.responsibleUser.id = :userId "  
       "AND t.deleted = false AND NOT EXISTS (SELECT 1 FROM t.taskProgress p WHERE p.name = 'ARCHIVED')")
void removeResponsibleUserId(UUID userId);