关于向PostgreSQL数据库插入Date类型数据报错问题解决方案

 更新时间:2024年12月05日 09:00:51   作者:errorsG  
本文给大家介绍在将数据库从Oracle改为PostgreSQL时遇到的日期类型插入错误,通过使用PostgreSQL的特定语法和更改动态SQL语句解决了问题,本文给大家介绍的非常详细,需要的朋友参考下吧

1|0问题场景

这个是公司项目进行更改,将项目的数据库从Oracle版本改为PostgreSQL版本时发生的错误。

控制台报错内容。

SQL: insert into table (...,RQ,...) select ...,?,... union all select ...,?,...
//(这里的...省略了其他字段, 主要是RQ日期类型报错就没列出)
Cause: org.postgresql.util.PSQLException: 错误: 字段 "rq" 的类型为 timestamp without time zone, 但表达式的类型为 text
建议:你需要重写或转换表达式 位置:404

mapper文件中的动态sql为

<insert id="insert" parameterType="java.util.List">
  insert into table
  (
  -- 省略,
  RQ,
  -- 省略)
  <foreach collection="list" item="item" separator="union all">
    select
    -- 省略,
    #{item.rq,jdbcType=TIMESTAMP},
    -- 省略
    -- from dual 这里当时是将项目Oracle数据库转为PostgreSQL数据库
  </foreach>
</insert>

对应的实体类为

@Data
public class Entity {
    // 省略
    private Date rq;
    // 省略
}

当在插入数据到数据库的时候就会报字段RQ类型错误的问题,但是通过检查sql语句后并没有发现明显的错误。

虽然控制台报错了,但还是能插入几条数据到数据库中,然后就报错不能插入了。这个时候考虑到有可能插入数据的问题,但是这里设置了#{item.rq,jdbcType=TIMESTAMP},数据类型也是符合PostgreSQL数据库的日期类型timestamp的,所以也不是这个的问题。

这个时候我将数据库中的数据清除,重新执行了几遍程序后发现有时候能够向数据库中插入几条数据,然后就报错,有时候一条数据都没有插入就报错了,很是奇怪。

2|0解决方法

后面使用了PostgreSQL的特定的语法,在rq后面加上::timestamp就能够正常插入了,如下

<insert id="insert" parameterType="java.util.List">
  insert into table
  (
  -- 省略,
  RQ,
  -- 省略)
  <foreach collection="list" item="item" separator="union all">
    select
    -- 省略,
    #{item.rq,jdbcType=TIMESTAMP}::timestamp,
    -- 省略
    -- from dual -- 这里是Oracle数据库的语法
  </foreach>
</insert>

但这样每个日期的字段都要加上这个,更改起来很麻烦,所以我在想有没有更好的解决方案。

后面我更改了这一条批量插入的动态sql。由于这个sql在Oracle数据库中是能够正常的运行的,有可能在PostgreSQL数据库存在兼容的问题,所以改成了在使用Mysql数据库时常写的动态sql,如下:

<insert id="inser" parameterType="java.util.List">
        insert into table (
        -- 省略,
        RQ,
        -- 省略)
        values
        <foreach collection="list" item="item" separator=",">
            (
            -- 省略,
            #{item.rq,jdbcType=TIMESTAMP},
            -- 省略
            )
        </foreach>
    </insert>

重新执行程序后,没有报错,数据正常插入,完美解决!

到此这篇关于向PostgreSQL数据库插入Date类型数据报错的文章就介绍到这了,更多相关向PostgreSQL数据库插入Date类型数据报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PostgreSQL ROW_NUMBER() OVER()的用法说明

    PostgreSQL ROW_NUMBER() OVER()的用法说明

    这篇文章主要介绍了PostgreSQL ROW_NUMBER() OVER()的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • PostgreSQL 自增语法的用法说明

    PostgreSQL 自增语法的用法说明

    这篇文章主要介绍了PostgreSQL 自增语法的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Navicat设置PostgreSQL数据库的表主键ID自增的方法

    Navicat设置PostgreSQL数据库的表主键ID自增的方法

    这篇文章主要介绍了Navicat设置PostgreSQL数据库的表主键ID自增的方法,文章通过图文结合的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-06-06
  • Postgresql 存储过程(plpgsql)两层for循环的操作

    Postgresql 存储过程(plpgsql)两层for循环的操作

    这篇文章主要介绍了Postgresql 存储过程(plpgsql)两层for循环的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL 自动Vacuum配置方式

    PostgreSQL 自动Vacuum配置方式

    这篇文章主要介绍了PostgreSQL 自动Vacuum配置方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Postgresql 动态统计某一列的某一值出现的次数实例

    Postgresql 动态统计某一列的某一值出现的次数实例

    这篇文章主要介绍了Postgresql 动态统计某一列的某一值出现的次数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • postgresql数据库如何查看数据中表的信息

    postgresql数据库如何查看数据中表的信息

    这篇文章主要给大家介绍了关于postgresql数据库如何查看数据中表信息的相关资料,要查询数据表信息,需要用到 系统表或系统视图等,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • postgres之jsonb属性的使用操作

    postgres之jsonb属性的使用操作

    这篇文章主要介绍了postgres之jsonb属性的使用操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • PostgreSQL pg_filenode.map文件介绍

    PostgreSQL pg_filenode.map文件介绍

    这篇文章主要介绍了PostgreSQL误删pg_filenode.map怎么办,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • PostgreSQL如何按照某一字段去重,并显示其他字段信息

    PostgreSQL如何按照某一字段去重,并显示其他字段信息

    这篇文章主要介绍了PostgreSQL如何按照某一字段去重,并显示其他字段信息问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05

最新评论