У меня есть таблица событий с составным ключом по идентификатору, созданный_at. Мой SQL-запрос выглядит следующим образом:
update events set status = true where (id, created_at) in ((1, '2024-06-17 12:00:44.674394+01'), (id2, time2), (id3, time3)...)
Как добиться этого при загрузке Spring JPA? Я попробовал код ниже:
@Modifying
@Transactional
@Query(
value = """
UPDATE events
SET status = true
WHERE (id, created_at) IN (:pkValues)
""",
nativeQuery = true
)
int updateStatus(List<Object[]> pkValues);
Но я получил ошибку:
[ОШИБКА: оператор не существует: запись = bytea Подсказка: нет оператора соответствует заданному имени и типам аргументов. Возможно, вам придется добавить явное приведение типов. Позиция: 87] [н/д].
Любая помощь высоко ценится.
Сгенерированный sql: [UPDATE event SET status = true WHERE (id, Create_at) IN (?,?)]
Проблема в :pkValues: вы указываете что-то неожиданное. Почему в сгенерированном sql есть только два вопросительных знака IN(?,?), когда мы предоставляем список?




@EmbeddedId MyPkEmbeddable yourIdField;@Query(value = "UPDATE events SET status = true WHERE yourIdField IN (:pkValues)... )
int updateStatus(List<MyPkEmbeddable> pkValues)
Объекты JPA располагаются вокруг таблиц, поэтому составной первичный ключ настраивается как @EmbeddableId.
см. https://www.baeldung.com/spring-jpa-embedded-method-parameters
Это должно сработать :-)
Вау, проще, чем ожидалось. Спасибо @gorefest.
Было бы неплохо, если бы вы могли выделить сгенерированный SQL из журнала вывода. Или это именно тот SQL, о котором вы упомянули первым?