You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jOOQ中如何结合条件更新使用.whereNotExists()实现插入更新逻辑

实现条件性UPSERT的jOOQ解决方案

这是个典型的条件性UPSERT场景,正好可以用jOOQ的MERGE语法来实现——它比你原来的INSERT ... WHERE NOT EXISTS更灵活,能同时处理插入和条件更新的逻辑。下面是适配你需求的代码:

create.mergeInto(DATA)
    .using(
        select(
            val(dailyData.getTicker()),
            val(dailyData.getOpen()),
            val(dailyData.getHigh()),
            val(dailyData.getLow()),
            val(dailyData.getClose()),
            val(dailyData.getDate())
        )
    )
    .on(DATA.DATE.eq(dailyData.getDate()))
    .whenMatchedThenUpdate()
        .where(DATA.REALTIME_CLOSE.eq(true)) // 仅当realtime close为true时更新
        .set(DATA.CLOSE, val(dailyData.getClose()))
    .whenNotMatchedThenInsert(
        DATA.TICKER,
        DATA.OPEN,
        DATA.HIGH,
        DATA.LOW,
        DATA.CLOSE,
        DATA.DATE
    )
    .values(
        val(dailyData.getTicker()),
        val(dailyData.getOpen()),
        val(dailyData.getHigh()),
        val(dailyData.getLow()),
        val(dailyData.getClose()),
        val(dailyData.getDate())
    )
    .execute();

代码逻辑说明:

  • mergeInto(DATA):启动MERGE操作,目标表是你的DATA表
  • using(...):提供要插入或用来更新的数据源,和你原来的SELECT逻辑一致,都是从dailyData中获取值
  • on(...):指定匹配条件——当表中存在DATE等于当前dailyData.getDate()的行时,触发匹配逻辑
  • whenMatchedThenUpdate():处理匹配到行的情况,这里我们加了where(DATA.REALTIME_CLOSE.eq(true))限定,只有当该行的realtime close列为true时,才执行更新操作,更新的字段是CLOSE为新的数值
  • whenNotMatchedThenInsert():处理没有匹配到行的情况,直接插入所有指定字段和对应的值,和你原来的插入逻辑一致
  • execute():执行整个MERGE语句

注意事项:

  • 请确保代码中的DATA.REALTIME_CLOSE是你实际的realtime close列名,如果字段名不同,请替换成对应的生成代码字段
  • 这个语法依赖于你的数据库支持MERGE(比如PostgreSQL 15+、MySQL、Oracle等主流数据库都支持),jOOQ会自动帮你转换成对应数据库的方言语法

内容的提问来源于stack exchange,提问作者Jozef Morvay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:18:51