使用 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 代码生成:对象 AbstractKeys 中的方法 createIndex 无法在对象 org.jooq.impl.AbstractKeys 中访问