当前位置: 首页 > 知识库问答 >
问题:

JooQ中的DuplicateKeyException

杭涵映
2023-03-14

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

我有以下场景:

  1. 如果由于重复密钥异常导致插入失败,请再次重试相同的操作,否则忽略该异常

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

我可以在插入和更新的两个单独调用中做到这一点,但是有没有办法在单个调用中做到这一点?

谢谢

共有1个答案

浦德明
2023-03-14

你的问题中有两个问题:

有没有办法只捕获DuplicateKeyException?JooQ将异常作为DataAccessException抛出。

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

  • 引用导致DataAccessException的JDBC SQLException。您可以通过dae访问它。getCause()或dae.getCause(SQLException.class),后者在原始的SQLException被多次包装的情况下很有用
  • 引用DataAccessException.sqlStateClass()。您要查找的是SQLStateClass.C23\u INTEGRITY\u CONSTRAINT\u VIOLATION。如果您的JDBC驱动程序在其异常中传播SQL状态类,那么这些信息将通过jOOQ提供给您

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

您可以在重复键更新的集子句中对更新条件进行编码:

INSERT INTO t (id, value)
VALUES (1, 2)
ON DUPLICATE KEY UPDATE SET
  value = CASE WHEN value = 2 THEN 3 ELSE value END

在上述示例中,只有当值为2时,UPDATE子句才会将值更新为3。

 类似资料:
  • jOOQ 高效的合并了复杂 SQL、类型安全、源码生成、Active Records、存储过程以及高级数据类型的 Java 类库。 示例代码: // Create a new record and insert it into the databaseTBookRecord book = create.newRecord(T_BOOK);book.setTitle("My first book")

  • 问题内容: 我有一些看起来像这样的代码: 目前,我正在执行以下操作以获取计数: 但是似乎必须要有一个更好的解决方案(类型安全…因为这就是使用jooq的全部目的)。有什么建议? 问题答案: 不幸的是,对于此特定查询,没有很多“更好”的方法来安全地键入值。您可以执行以下操作以添加类型安全性: 问题在于,有关投影的大多数类型信息在“到达”方法时已“丢失”给Java编译器。没有办法,一个方法可以从恢复它条

  • 我正在尝试JOOQ,并试图使用连接语句从3个表(作者,书籍和文章)中进行选择。ERD如下: 我的问题如下: 我也有一个原型对象如下: (或任何其他pojo)将所有实体(作者详细信息图书列表文章列表)保存到一个对象中。我的问题是,是否有某种方法可以使用JOOQ将所有三个表映射到一个对象中。 提前谢谢。

  • 问题内容: 假设我为JOOQ提供了一个自定义,它恰好使用自动提交设置为false的连接池。 实现大致是: 我该如何将两个jooq查询包装到一个事务中? 使用DefaultConnectionProvider很容易,因为只有一个连接-但是对于池,我不确定该怎么做。 问题答案: jOOQ 3.4交易API 使用jOOQ 3.4,已添加事务API以通过JDBC,Spring或JTA事务管理器进行抽象。该

  • 如果我用ctx.insertinto来做这个...很好用。我最初使用的是Jooq3.14.0,但升级到最新的3.14.4对此没有帮助。生成的Keys类一定有问题,因为在初始化Keys类之前一切都正常工作。是Postgresql表结构出了问题,还是代码生成出了问题? 完整回购如下:https://github.com/eriran/criminal-api/tree/security-tumpt

  • 我将springBoot与JOOQ一起使用,并希望记录生成的SQL。 我将slf4J添加到maven依赖项和log4j.xml中,就像在JOOQ文档中一样(http://www.JOOQ.org/doc/latest/manual/sql-execution/logging/)。但是当jooq执行一些查询时,我在控制台中看不到任何日志。