DuplicateKeyException в JooQ - PullRequest
       9

DuplicateKeyException в JooQ

0 голосов
/ 28 ноября 2018

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

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

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

Есть ли способ перехватить только DuplicateKeyException?JooQ вызывает исключение как DataAccessException.

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

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

Спасибо !!

1 Ответ

0 голосов
/ 30 ноября 2018

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

Есть ли способ отловить только 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 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.

...