解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常
作者:mmseoamin日期:2024-03-20

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

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

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

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

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

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

解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常,在这里插入图片描述,第1张

文章目录

    • 引言
    • 问题描述
    • 解决方案
    • 总结
    • 原创声明

      错误截图:

      解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常,在这里插入图片描述,第2张

      引言

      在使用 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 参数明确指定数据库字段的数据类型。本文提供的解决方案可以帮助您顺利解决这个异常,让您的项目顺利运行。

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

      原创声明

      ======= ·