Jooq中的事务和条件更新与scala

时间:2016-05-15 11:15:24

标签: postgresql scala transactions jooq

我试图运行此更新查询:

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和Scala。 感谢

1 个答案:

答案 0 :(得分:2)

使用约束解决此问题。

这通常会在具有Sheets("MyOtherSheet").Range("MyOtherSheetRangeAddress").ProperRangeMethod 约束的数据库中解决:

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()