jOOQ 插入 .. Postgres 不存在的地方
jOOQ insert into .. where not exists for Postgres
我正在尝试在 jOOQ 中为 Postgres 做一个更新插入式的语句。我 运行 所在的框架负责处理这种特定情况下的并发问题,因此我对此并不担心。我只使用 jOOQ 创建 SQL,实际执行是通过 Spring 的 JdbcTemplate 和 BeanPropertySqlParameterSource 完成的。
我决定采用两步 "insert..where not exists" / "update .." 流程。
我的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" 子句。
更改编程语言或数据库的建议在我的情况下不可行。
如果你想在 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))
)
);
我正在尝试在 jOOQ 中为 Postgres 做一个更新插入式的语句。我 运行 所在的框架负责处理这种特定情况下的并发问题,因此我对此并不担心。我只使用 jOOQ 创建 SQL,实际执行是通过 Spring 的 JdbcTemplate 和 BeanPropertySqlParameterSource 完成的。
我决定采用两步 "insert..where not exists" / "update .." 流程。
我的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" 子句。
更改编程语言或数据库的建议在我的情况下不可行。
如果你想在 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))
)
);