解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁

🦄 博客首页——猫头虎的博客🎐

🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺

🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐

🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥



错误截图:

引言

在使用 MyBatis-Plus 和 PostgreSQL 数据库时,有时候会遇到 org.postgresql.util.PSQLException 异常,错误信息为 “conversion to class java.time.OffsetDateTime from int4 not supported”。这个异常通常是由于数据库字段类型与实体类属性类型不匹配引起的。本文将介绍如何通过在实体类中添加 @TableField 注解并指定参数来解决这个问题。

问题描述

当使用 MyBatis-Plus 连接 PostgreSQL 数据库时,如果数据库中某个字段的数据类型是 TIMESTAMP,而对应的实体类属性类型是 OffsetDateTime,可能会在查询或插入数据时抛出异常:

org.postgresql.util.PSQLException: ERROR: column "create_time" is of type timestamp without time zone but expression is of type integer
Hint: You will need to rewrite or cast the expression.
Position: xx
org.springframework.dao.DataIntegrityViolationException: Error attempting to get column 'id' from result set.  Cause: org.postgresql.util.PSQLException: conversion to class java.time.OffsetDateTime from int4 not supported
; conversion to class java.time.OffsetDateTime from int4 not supported; nested exception is org.postgresql.util.PSQLException: conversion to class java.time.OffsetDateTime from int4 not supported] with root cause
org.postgresql.util.PSQLException: conversion to class java.time.OffsetDateTime from int4 not supported

解决方案

方向一:

由于在从数据库结果集中尝试获取’ id ‘列时出现类型转换错误。具体来说,数据库中的’ id '列的数据类型是int4(整数),但在映射到Java实体类时,使用了java.time.OffsetDateTime(时间日期)类型,导致转换失败。

  1. 修改Java实体类的数据类型:
    你可以将对应’ id '列的数据类型修改为int或Long类型,以便与数据库的int4类型匹配。例如,在你的Java实体类中,将id字段的数据类型改为Long,而不是OffsetDateTime。这样,你就可以正确地映射数据库的id列数据到Java实体类。
  2. 使用类型转换器:
    如果你需要保持Java实体类中的id字段为OffsetDateTime类型,你可以考虑使用Spring的类型转换器(TypeConverter)或自定义的属性编辑器(PropertyEditor)来处理数据类型转换。这样,你可以在获取数据时,将数据库返回的int值转换为OffsetDateTime类型。这个方法需要编写一些代码,但可以让你在Java实体类中保持OffsetDateTime类型的数据。

方向二:

解决这个异常的方法是通过在实体类中添加 @TableField 注解,并使用 jdbcType 参数来显式指定数据库字段的数据类型。

假设我们有一个名为 User 的实体类,其中有一个字段名为 createTime,数据类型为 OffsetDateTime。在实体类中对该字段进行注解如下:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.time.OffsetDateTime;
@TableName("user") // 表名
public class User {
    // 其他属性省略...
    @TableField(value = "create_time", jdbcType = JdbcType.TIMESTAMP)
    private OffsetDateTime createTime;
    // 其他方法省略...
}

在上面的代码中,我们在 createTime 字段上添加了 @TableField 注解,并使用 jdbcType 参数指定了该字段在数据库中的数据类型为 TIMESTAMP。

总结

在使用 MyBatis-Plus 连接 PostgreSQL 数据库时,遇到 “conversion to class java.time.OffsetDateTime from int4 not supported” 异常,通常是因为实体类字段的数据类型与数据库字段的数据类型不匹配所致。为了解决这个问题,我们可以在实体类中使用 @TableField 注解,并通过 jdbcType 参数明确指定数据库字段的数据类型。本文提供的解决方案可以帮助您顺利解决这个异常,让您的项目顺利运行。

希望本文对您有所帮助!如有疑问或建议,请随时在评论区留言,谢谢阅读!

原创声明

======= ·

  • 原创作者: 猫头虎

作者wx: [ libin9iOak ]

  • 今日已学习

本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
XML Java 数据库连接
解决在mybatis中使用class属性绑定映射文件出现的异常问题~
解决在mybatis中使用class属性绑定映射文件出现的异常问题~
|
SQL Java Spring
【MybatisPlus异常】The SQL execution time is too large, please optimize
【MybatisPlus异常】The SQL execution time is too large, please optimize
334 0
【MybatisPlus异常】The SQL execution time is too large, please optimize
|
3月前
|
SQL Java 数据库连接
Mybatis的Cursor如何避免OOM异常
在 Mybatis 中,`Cursor` 是一个特殊对象,用于避免大量数据查询时导致的 OOM 错误。它通过懒加载和迭代器实现内存友好型数据处理,尤其适用于大规模数据查询。使用时只需将 Mapper 文件中的方法返回值设为 `Cursor<T>`。其原理在于操作原生 `Statement` 并按需获取数据,而非一次性加载所有数据,从而避免内存溢出。
135 3
|
6月前
|
XML 关系型数据库 数据库
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
610 0
|
SQL Java 数据库
【Mybatis-plus异常】mybatis-plus updateById方法更新不了空字符串和null的解决方法
【Mybatis-plus异常】mybatis-plus updateById方法更新不了空字符串和null的解决方法
709 0
|
7月前
|
Java 关系型数据库 MySQL
整合SpringBoot与MyBatis时报错时区异常
整合SpringBoot与MyBatis时报错时区异常
58 0
|
存储 SQL 缓存
【问题处理】—— Mybatis缓存可改导致的异常
【问题处理】—— Mybatis缓存可改导致的异常
143 0
|
关系型数据库 PostgreSQL
PostgreSQL异常重启postmaster.pid处理
PostgreSQL异常重启postmaster.pid处理
258 0
|
7月前
|
Java 测试技术
使用MybatisPlus时出现的java.lang.NullPointerException异常~
使用MybatisPlus时出现的java.lang.NullPointerException异常~
355 0
使用MybatisPlus时出现的java.lang.NullPointerException异常~
|
7月前
|
SQL 关系型数据库 MySQL
PostgreSQL【异常 01】java.io.IOException:Tried to send an out-of-range integer as a 2-byte value 分析+解决
PostgreSQL【异常 01】java.io.IOException:Tried to send an out-of-range integer as a 2-byte value 分析+解决
515 1