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

Spring Boot R2DBC对接PostgreSQL报错Cannot decode value of type long

问题解答

一、解码错误的原因

PostgreSQL里OID 20对应的是bigint类型,你用原始类型long接收时触发错误,本质是R2DBC对原始类型和包装类型的处理逻辑不一样:

  • 原始类型long不能存null,如果数据库里的bigint字段出现null值(或者查询结果中该字段为null),R2DBC没法把null转成long,直接抛出解码异常;
  • 用Long::class.javaObjectType指定用包装类型Long映射时,因为Long可以为null,能完美兼容字段为null的场景,自然就解决了问题。

另外提一句,Spring R2DBC 1.0.x版本和PostgreSQL 16的类型映射适配有小瑕疵,原始类型的null处理没做兼容,包装类型则不受影响。

二、Spring R2DBC 易用查询库推荐

给你几个简化SQL编写的选项:

  • Spring Data R2DBC Repository:官方原生的Repository抽象,不用写原生SQL,靠方法名就能自动生成查询逻辑,比如findById(Long id)、findByUsernameAndEnabled(String username, boolean enabled),完全适配响应式编程,是最省心的方案;
  • R2DBC Client:Spring R2DBC自带的轻量客户端,支持链式调用拼SQL,示例代码:
    client.sql("SELECT id, name FROM users WHERE id = :userId")
          .bind("userId", 100L)
          .map(User.class)
          .one()
    
  • jOOQ + R2DBC:类型安全的SQL工具,能自动生成实体类和查询代码,完全避免手写SQL的语法错误,复杂查询场景下优势明显,响应式支持也很完善。

内容的提问来源于stack exchange,提问作者Sachin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:33:12