Обновление Spring Boot JPA с использованием составных первичных ключей

У меня есть таблица событий с составным ключом по идентификатору, созданный_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 из журнала вывода. Или это именно тот SQL, о котором вы упомянули первым?

rento 17.06.2024 13:11

Сгенерированный sql: [UPDATE event SET status = true WHERE (id, Create_at) IN (?,?)]

Forece85 17.06.2024 13:16

Проблема в :pkValues: вы указываете что-то неожиданное. Почему в сгенерированном sql есть только два вопросительных знака IN(?,?), когда мы предоставляем список?

Alex 17.06.2024 15:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Создайте свой идентификатор как @Embeddable, например. MyPkEmebddable
  • Используйте свой тип идентификатора в своем классе, используя @EmbeddedId, например. @EmbeddedId MyPkEmbeddable yourIdField;
  • Создайте заявление JPQL, используя тип

@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.

Forece85 17.06.2024 20:29

Другие вопросы по теме