You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:57:28