jOOQ insert into .. where not exists for Postgres
我试图在jOOQ中为Postgres做一个upsert风格的声明。 我正在运行的框架在这种特定情况下处理并发问题,所以我并不担心。 我只使用jOOQ来创建SQL,实际执行是通过Spring的JdbcTemplate和BeanPropertySqlParameterSource完成的。
我决定采用两步"插入......不存在"/"更新..."的过程。
我的SQL是:
1 2 3 | 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中的"where not exists"子句中表达jOOQ参数。
在我的情况下,改变编程语言或数据库的建议是不可行的。
如果要在jOOQ中重用命名参数,理想情况下,在查询之外创建AST元素,如下所示:
1 2 3 4 | // Assuming a static import import static org.jooq.impl.DSL.*; Param<Integer> myId = param("myId", INTEGER.class); |
然后,您可以在查询中多次使用它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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)) ) ); |