如何在jOOQ中编写无返回值的PostgreSQL CTE
jOOQ中CTE使用无RETURNING子句DML的类型匹配问题解决办法
当你在jOOQ中使用DSL#name(...)定义CTE时,不带RETURNING子句的UPDATE/INSERT/DELETE语句会因为类型不匹配无法直接传入as()方法——原因是不带RETURNING的DML语句属于Query类型,而CTE要求传入的是能生成结果集的ResultQuery或Select类型。
解决办法有两种:
方法一:使用无参的
returning()方法
即使不需要返回任何字段,调用无参的returning()可以将DML语句转换为ResultQuery类型,满足CTE的类型要求,示例:name("my_cte").as( update(MY_TABLE) .set(MY_TABLE.NAME, "new_value") .where(MY_TABLE.ID.eq(1)) .returning() // 无参调用,返回空结果集,适配CTE类型 )方法二:用原生SQL包装DML语句
如果你的数据库支持在CTE中执行无返回结果的DML(如PostgreSQL),可以用DSL.resultQuery()将原生DML语句包装为ResultQuery类型,示例:name("my_cte").as( DSL.resultQuery("UPDATE my_table SET name = 'new_value' WHERE id = 1") )
推荐优先使用方法一,既能利用jOOQ的类型安全特性,又避免写原生SQL的维护成本。
内容的提问来源于stack exchange,提问作者negimaster
相关产品推荐
相关产品推荐

