我正在使用JooQ在Aurora MySQL上执行CRUD操作。
我有以下情况:
有什么方法只能捕获DuplicateKeyException吗? JooQ将异常抛出为DataAccessException。
在启用OnDuplicateKeyUpdate时,似乎如果记录存在,它将盲目更新数据库中的记录。我的用例是如果记录存在于数据库中,然后在满足更新条件的情况下更新记录。
我可以在两个单独的插入和更新调用中做到这一点,但是有没有办法在单个调用中做到这一点?
谢谢!
答案 0 :(得分:1)
您的问题中有两个问题:
有什么方法只能捕获DuplicateKeyException吗? JooQ将异常抛出为DataAccessException。
是的。 jOOQ对于像JDBC这样的单个错误没有单独的异常类型,但是它仍然:
DataAccessException
的JDBC SQLException
。您可以通过dae.getCause()
或dae.getCause(SQLException.class)
访问它,如果原始SQLException
被包装了好几次,后者很有用。DataAccessException.sqlStateClass()
。您要寻找的是SQLStateClass.C23_INTEGRITY_CONSTRAINT_VIOLATION
。如果您的JDBC驱动程序在其异常中传播SQL状态类,则可以通过jOOQ向您提供此信息。在启用OnDuplicateKeyUpdate时,似乎如果记录存在,它将盲目更新数据库中的记录。我的用例是如果记录存在于数据库中,然后在满足更新条件的情况下更新记录。
您可以在ON DUPLICATE KEY UPDATE
的{{1}}子句中编码您的更新条件:
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
。