如何在Jooq Update语句中正确使用ArrayList类型字段?
问题修正方案
错误根源:你试图用eq()方法将数据库字段与List集合直接比较,这不符合PostgreSQL的SQL语法规则,jOOQ无法将这种操作转换为合法的PostgreSQL语句,因此抛出类型不支持的错误。
需要从以下几个地方修正代码:
1. 修正save方法的初始条件
原代码初始条件里直接用field("send.m_id").eq(req.getMemId)匹配List集合,这是错误的,应该只保留pr_id的匹配,m_id的条件交给applyConditions方法处理:
public Result<?> save(Long id, Request req) { // 初始条件只保留pr_id的匹配 Condition condition = field("send.pr_id").eq(id); condition = req.applyConditions(condition); return ctx.update(table(snp).as("send")) .set(field("status"), "D") .where(condition) .returning() .fetch(); }
2. 修正Request类的applyConditions方法
当memId不为空时,使用in()方法替代eq(),对应SQL中的IN语法;或者使用eq(any(...))对应PostgreSQL的= ANY语法,两种方式都可以解决集合匹配问题。同时修正方法内的变量名笔误:
public class Request { Integer prId; List<Long> memId; public Condition applyConditions(Condition condition) { Condition mod = condition; if(Objects.nonNull(prId)) { mod = mod.and(field("send.pr_id").eq(prId)); } if(Objects.nonNull(memId) && !memId.isEmpty()) { // 方式1:使用IN语法 mod = mod.and(field("send.m_id").in(memId)); // 方式2:使用PostgreSQL的ANY语法,效果和IN一致 // mod = mod.and(field("send.m_id").eq(any(memId))); } // 修正笔误:返回mod而非modified return mod; } }
额外说明
- 建议添加
!memId.isEmpty()判断,避免传入空集合导致SQL语法错误 - 如果你使用jOOQ代码生成器生成了表和字段类,尽量用生成的静态字段(比如
SEND.M_ID)替代field("send.m_id"),可以避免拼写错误并获得类型安全支持
内容的提问来源于stack exchange,提问作者Dr.Joe
相关产品推荐
相关产品推荐

