DuplicateKeyException в JooQ

Я использую JooQ для выполнения операции CRUD на Aurora MySQL.

У меня есть следующий сценарий:

  1. Если вставка не удалась из-за исключения дублирующего ключа, повторите эту же операцию еще раз, в противном случае игнорируйте исключение.
  2. Если вставка не удалась, обновите записи, если выполнены условия.

Есть ли способ поймать только DuplicateKeyException? JooQ генерирует исключение как DataAccessException.

При включении OnDuplicateKeyUpdate кажется, что если запись существует, она будет слепо обновлять запись в базе данных. Мой вариант использования, если запись существует в базе данных, то обновите запись, если выполнены условия обновления.

Я могу сделать это в два отдельных вызова Вставить и Обновить, но есть ли способ сделать это в один вызов?

Спасибо!!

1 ответ

В вашем вопросе есть два вопроса:

Есть ли способ поймать только DuplicateKeyException? JooQ генерирует исключение как DataAccessException.

Да, конечно. В jOOQ нет отдельных типов исключений для отдельных ошибок, таких как JDBC, но все же:

  • Ссылки на JDBC SQLException что вызвало DataAccessException, Вы можете получить к нему доступ через dae.getCause() или же dae.getCause(SQLException.class) последнее полезно в случае оригинала SQLException будучи обернутым несколько раз.
  • Ссылки на DataAccessException.sqlStateClass(), Тот, который вы ищете SQLStateClass.C23_INTEGRITY_CONSTRAINT_VIOLATION, Если ваш драйвер JDBC распространяет класс состояний SQL в своих исключениях, то эта информация будет доступна вам через jOOQ.

При включении OnDuplicateKeyUpdate кажется, что если запись существует, она будет слепо обновлять запись в базе данных. Мой вариант использования, если запись существует в базе данных, то обновите запись, если выполнены условия обновления.

Вы можете закодировать ваше условие обновления в ON DUPLICATE KEY UPDATE "s SET пункт:

INSERT INTO t (id, value)
VALUES (1, 2)
ON DUPLICATE KEY UPDATE SET
  value = CASE WHEN value = 2 THEN 3 ELSE value END

В приведенном выше примере UPDATE пункт будет обновлен value в 3 только если это 2,

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