jOOQ插入..对于Postgres不存在

时间:2015-04-10 20:07:09

标签: postgresql jooq

我正试图在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。我不确定如何在选择中表达jOOQ参数和在jOOQ中表达“where not exists”子句。

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

1 个答案:

答案 0 :(得分: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))
     )
  );