java - JooQ 中的 DuplicateKeyException
问题描述
我正在使用 JooQ 在 Aurora MySQL 上执行 CRUD 操作。
我有以下情况:
- 如果由于重复键异常而导致插入失败,则再次重试相同的操作,否则忽略该异常。
- 如果插入失败,则在满足条件时更新记录。
有没有办法只捕获 DuplicateKeyException ?JooQ 将异常作为 DataAccessException 抛出。
在启用 OnDuplicateKeyUpdate 时,似乎如果记录存在,它将盲目更新数据库中的记录。我的用例是如果记录存在于数据库中,则在满足更新条件时更新记录。
我可以在插入和更新的两个单独调用中做到这一点,但是有没有办法在一次调用中做到这一点?
谢谢!!
解决方案
你的问题有两个问题:
有没有办法只捕获 DuplicateKeyException ?JooQ 将异常作为 DataAccessException 抛出。
是的当然。jOOQ 没有针对 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
推荐阅读
- c# - Add dependency after deserializing objects
- mysql - Is there a way to have a table with values that references the columns themselves of another table?
- django - Username turns into link to user profile Django
- c# - How to search and extract text from html file?
- jquery - 加载图像数组后执行函数
- python - ctypes __del__ 的 ctypes.Structure 子类未针对指向结构的指针调用
- java - Java无限while循环,具体程序问题
- firebase - Firebase 函数示例中的 LinkedIn oauth 失败
- c++ - 无法理解三元运算符的用法
- reactjs - 为什么 create-react-app 模板系统将 package.json 条目列入黑名单?