使用 scala 在 Jooq 中进行交易和条件更新

Posted

技术标签:

【中文标题】使用 scala 在 Jooq 中进行交易和条件更新【英文标题】:transactions and conditional update in Jooq with scala 【发布时间】:2016-09-11 06:39:54 【问题描述】:

我正在尝试运行此更新查询:

val updatedRows: Int = jooqDSL.dsl update ACCOUNT set(
          ACCOUNT.LOGIN_MEANS, loginMeans.loginType.toString) set(
          ACCOUNT.LOGIN_DATA, loginMeans.loginData) where (
          ACCOUNT.ID equal accountId) execute()

但如果我还没有具有不同 ACCOUNT.ID 但具有相同登录数据和方法的记录,它必须更新 。我本可以在此之前进行搜索以尝试找到这些记录(如果存在)。问题是我需要这个查询是一个单一的事务。 所以我考虑在查询中添加一个条件——只有在没有找到具有相同方法/数据字段的任何其他记录时,查询才会运行,但我找不到任何关于如何使用 DSL 进行操作的帮助和斯卡拉。 谢谢

【问题讨论】:

【参考方案1】:

用约束解决这个问题。

这通常会在数据库中使用UNIQUE 约束来解决:

ALTER TABLE account 
  ADD CONSTRAINT acco_uk_means_data UNIQUE (login_means, login_data)

如果更新会产生一个现有的(login_means, login_data) 组合,上面的语句将抛出一个违反约束的异常。

用一个查询解决这个问题

如果约束不是一个选项,那么只需添加一个NOT EXISTS 谓词:

val updatedRows: Int = jooqDSL.dsl
   .update(ACCOUNT)
   .set(ACCOUNT.LOGIN_MEANS, loginMeans.loginType.toString)
   .set(ACCOUNT.LOGIN_DATA, loginMeans.loginData)
   .where(ACCOUNT.ID equal accountId)
   .andNotExists(
        selectOne()
       .from(ACCOUNT)
       .where(ACCOUNT.LOGIN_MEANS.equal(loginMeans.loginType.toString))
       .and(ACCOUNT.LOGIN_DATA.equal(loginMeans.loginData))
    )
   .execute()

不过,您可能仍会在这两列上添加索引:

CREATE INDEX acco_i_means_data ON (login_means, login_data)

【讨论】:

谢谢卢卡斯!没有考虑约束解决方案。很不错

以上是关于使用 scala 在 Jooq 中进行交易和条件更新的主要内容,如果未能解决你的问题,请参考以下文章

Jooq postgre 在 play2.5 scala 中插入错误

如何在 jOOQ 中使用 Scala 的字符串插值?

Jooq 不使用春季交易

jooq + scala 代码生成:对象 AbstractKeys 中的方法 createIndex 无法在对象 org.jooq.impl.AbstractKeys 中访问

jooq 交易开枪 - 不能使用'returningResult()'?

使用 Scala/Akka 在 JVM 中进行高频交易