Anu*_*ahu 6 java mysql sql jooq amazon-aurora
我正在使用 JooQ 在 Aurora MySQL 上执行 CRUD 操作。
我有以下场景:
有没有办法只捕获 DuplicateKeyException?JooQ 将异常作为 DataAccessException 抛出。
在启用 OnDuplicateKeyUpdate 时,似乎如果记录存在,它将盲目更新数据库中的记录。我的用例是如果记录存在于数据库中,则在满足更新条件时更新记录。
我可以在两个单独的 Insert 和 Update 调用中做到这一点,但有没有办法在单个调用中做到这一点?
谢谢!!
你的问题有两个问题:
有没有办法只捕获 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'sSET子句中对更新条件进行编码:
INSERT INTO t (id, value)
VALUES (1, 2)
ON DUPLICATE KEY UPDATE SET
value = CASE WHEN value = 2 THEN 3 ELSE value END
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,该UPDATE条款将更新value至3只有当它是2。