我正在使用 JooQ 在 Aurora MySQL 上执行 CRUD 操作。
我有以下情况:
- 如果由于重复键异常导致插入失败,则再次重试相同的操作,否则忽略该异常。
- 如果插入失败,则在满足条件的情况下更新记录。
有没有办法只捕获 DuplicateKeyException? JooQ 正在抛出 DataAccessException 异常。
启用OnDuplicateKeyUpdate后,如果记录存在,它似乎会盲目更新数据库中的记录。我的用例是如果记录存在于数据库中,则在满足更新条件时更新记录。
我可以在两次单独的插入和更新调用中做到这一点,但是有什么方法可以在单个调用中做到这一点吗?
谢谢!!
最佳答案
您的问题中有两个问题:
Is there any way to catch DuplicateKeyException only? JooQ is throwing exception as DataAccessException.
是的,当然。 jOOQ 不像 JDBC 那样为单个错误提供单独的异常类型,但它仍然:
- 引用导致
DataAccessException
的 JDBCSQLException
。您可以通过dae.getCause()
或dae.getCause(SQLException.class)
访问它,后者在原始SQLException
被包装多次的情况下很有用。 - 引用
DataAccessException.sqlStateClass()
。您要找的是SQLStateClass.C23_INTEGRITY_CONSTRAINT_VIOLATION
。如果您的 JDBC 驱动程序在其异常中传播 SQL 状态类,那么您将可以通过 jOOQ 获得此信息。
On enabling OnDuplicateKeyUpdate, it seems that if the record exist it will blindly update the record in database. My use case is if the record exist in database then update the record if the update conditions are met.
您可以在 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
在上面的示例中,仅当 value
为 2
时,UPDATE
子句才会将其更新为 3
。
关于java - JooQ 中的 DuplicateKeyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53518213/