DuplicateKeyException в JooQ
Я использую JooQ для выполнения операции CRUD на Aurora MySQL.
У меня есть следующий сценарий:
- Если вставка не удалась из-за исключения дублирующего ключа, повторите эту же операцию еще раз, в противном случае игнорируйте исключение.
- Если вставка не удалась, обновите записи, если выполнены условия.
Есть ли способ поймать только 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
,