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
相关产品推荐
相关产品推荐

