当前位置: 代码网 > it编程>数据库>MsSqlserver > 关于向PostgreSQL数据库插入Date类型数据报错问题解决方案

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

2024年12月06日 MsSqlserver 我要评论
1|0问题场景这个是公司项目进行更改,将项目的数据库从oracle版本改为postgresql版本时发生的错误。控制台报错内容。sql: insert into table (...,rq,...)

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类型数据报错内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com