JPQL - плохой выбор для работы. b.author.authorId
не допускается, так как он переводится в SQL JOIN
. JPQL также не поддерживает подзапросы в операторах UPDATE
. Вы могли бы сопоставить author_id
с недвижимостью в Books
:
@Column(name = "author_id", insertable=false, updatable=false)
private Long authorId;
С учетом вышесказанного, вы можете просто сделать:
UPDATE Books b SET b.book_title = :bookTitle WHERE b.authorId = :authorId
но вам придется смириться с изменением модели вашего домена, чтобы объединить один случай с запросом UPDATE
.
Вы должны иметь возможность разбить задачу на два запроса следующим образом:
List<Long> ids = em.createQuery("SELECT b.id FROM Books b WHERE b.author.id = :authorId", Long.class)
.setParameter("authorId", authorId)
.getResultList();
em.createQuery("UPDATE Books b SET b.bookTitle = :bookTitle WHERE b.id IN :ids")
.setParameter("ids", ids)
.setParameter("bookTitle", bookTitle)
.executeUpdate();
Или вы можете просто обновить сущности из кода:
em.createQuery("SELECT b.id FROM Books b WHERE b.author.id = :authorId", Book.class)
.setParameter("authorId", authorId)
.getResultList()
.forEach(book -> book.setBookTitle(bookTitle));