【问题标题】:jOOQ insert into .. where not exists for PostgresjOOQ 插入到 .. Postgres 不存在的地方
【发布时间】:2015-06-16 16:03:42
【问题描述】:

我正在尝试在 jOOQ 中为 Postgres 做一个 upsert 风格的声明。我正在运行的框架会处理这种特定情况下的并发问题,所以我并不担心。我只使用 jOOQ 来创建 SQL,实际执行是通过 Spring 的 JdbcTemplate 和 BeanPropertySqlParameterSource 完成的。

我决定采用两步“插入..不存在的地方”/“更新..”过程。

我的 SQL 是:

insert into mytable (my_id, col1, col2) select :myId, 
   :firstCol, :secondCol where not exists (select 1 
   from mytable where my_id = :myId)

我正在使用 Postgres 9.4、jOOQ 3.5。我不确定如何表达 select 中的 jOOQ 参数和 jOOQ 中的“where not exists”子句。

在我的情况下,更改编程语言或数据库的建议不可行。

【问题讨论】:

  • so ...“如何在 SQL 语句(在 JOOQ 中)中使用多个位置的单个查询参数”?

标签: postgresql jooq


【解决方案1】:

如果您想在 jOOQ 中重用命名参数,理想情况下,您可以在查询之外创建 AST 元素,如下所示:

// Assuming a static import
import static org.jooq.impl.DSL.*;

Param<Integer> myId = param("myId", Integer.class);

然后您可以在查询中多次使用它:

using(configuration)
  .insertInto(MY_TABLE, MY_TABLE.MY_ID, MY_TABLE.COL1, MY_TABLE.COL2)
  .select(
     select(
        myId, 
        param("firstCol", MY_TABLE.COL1.getType()),
        param("secondCol", MY_TABLE.COL2.getType())
     )
     .whereNotExists(
        selectOne()
        .from(MY_TABLE)
        .where(MY_TABLE.MY_ID.eq(myId))
     )
  );

【讨论】:

  • 太棒了!谢谢。 .select(select(...) 对我来说是缺少的魔法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2021-08-01
  • 2018-10-12
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多