Java JooQ中的重复键异常

Java JooQ中的重复键异常,java,mysql,sql,jooq,amazon-aurora,Java,Mysql,Sql,Jooq,Amazon Aurora,我正在使用JooQ对Aurora MySQL执行CRUD操作 我有以下情况: 如果由于重复密钥异常导致插入失败,请再次重试相同的操作,否则忽略异常 如果插入失败,则在满足条件时更新记录 有没有办法只捕获重复的KeyException? JooQ正在将异常作为DataAccessException引发 启用OnDuplicateKeyUpdate时,如果记录存在,它似乎会盲目地更新数据库中的记录。我的用例是,如果数据库中存在记录,那么在满足更新条件的情况下更新记录 我可以在两个单独的Insert和

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

我有以下情况:

  • 如果由于重复密钥异常导致插入失败,请再次重试相同的操作,否则忽略异常
  • 如果插入失败,则在满足条件时更新记录
  • 有没有办法只捕获重复的KeyException? JooQ正在将异常作为DataAccessException引发

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

    我可以在两个单独的Insert和Update调用中实现这一点,但有没有办法在单个调用中实现这一点


    谢谢

    您的问题中有两个问题:

    有没有办法只捕获重复的KeyException?JooQ正在将异常作为DataAccessException引发

    当然可以。jOOQ没有针对个别错误(如JDBC)的单独异常类型,但它仍然:

    • 引用导致异常的JDBC
      SQLException
      。您可以通过
      dae.getCause()
      或后者访问它,后者在原始
      SQLException
      被多次包装的情况下非常有用
    • 参考。你要找的是。如果您的JDBC驱动程序在其异常中传播SQL状态类,那么您可以通过jOOQ获得这些信息
    启用OnDuplicateKeyUpdate时,如果记录存在,它似乎会盲目地更新数据库中的记录。我的用例是,如果数据库中存在记录,那么在满足更新条件的情况下更新记录

    您可以在重复密钥更新的
    上的
    SET
    子句中对更新条件进行编码:

    插入t(id,值)
    值(1,2)
    关于重复密钥更新集
    值=案例,当值=2时,则3否则值结束
    

    在上面的示例中,
    UPDATE
    子句仅在
    2
    时才会将
    value
    更新为
    3

    值得指出的是,这个SQL状态类还用于insert上的NOTNULL约束。如果集成测试没有抓住它,我会咬我的。