JooQ中的DuplicateKeyException

2020年7月16日 9点热度 0条评论

我正在使用JooQ在Aurora MySQL上执行CRUD操作。

我有以下情况:

  • 如果由于重复的密钥异常而导致插入失败,请再次重试相同的操作,否则将忽略该异常。
  • 如果插入失败,则在满足条件的情况下更新记录。
  • 有什么方法只能捕获DuplicateKeyException吗?

    JooQ将异常抛出为DataAccessException。

    启用OnDuplicateKeyUpdate时,似乎如果记录存在,它将盲目更新数据库中的记录。我的用例是如果记录存在于数据库中,然后在满足更新条件的情况下更新记录。

    我可以在两次单独的“插入”和“更新”调用中做到这一点,但是在一次调用中有什么办法吗?

    谢谢!!

    解决方案如下:

    您的问题中有两个问题:

    有什么办法只能捕获DuplicateKeyException吗? JooQ将异常抛出为DataAccessException。

    当然是。 jOOQ对于像JDBC这样的单个错误没有单独的异常类型,但是它仍然:

  • 引用导致 SQLException 的JDBC 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