AI大模型教程
一起来学习

【### Error updating database. Cause: org.postgresql.util.PSQLException: 错误: 字段 “fz_old“ 的类型为 numer】

项目场景:

java代码中使用mybatis更新数据库表中的数据报错。错误信息如下:

### Error updating database.  Cause: org.postgresql.util.PSQLException: 错误: 字段 "fz_old" 的类型为 numeric, 但表达式的类型为 text
  建议:你需要重写或转换表达式
  位置:134
### The error may exist in file [D:productmxptmxpt-back-lightmxpt-modulesmxpt-dispatch-centertargetclassesmapperResourceCalcSceneSectionResultMapper.xml]
### The error may involve defaultParameterMap
### The error occurred while setting parameters

问题描述

代码报错信息:

update id="updateResourceCalcSceneSectionResult">
        update resource_calc_scene_section_result t1
        set>
            fq=t2.fq,
            qjq=t2.qjq,
            fz=t2.fz,
            fz_old=t2.fzOld
        /set>
        from (
        values
        foreach collection="list" item="item" index="index" open="" close="" separator=",">
            trim prefix="(" suffix=")">
                #{item.fq},
                #{item.qjq},
                #{item.fz},
                #{item.tm},
                #{scprodId},
                #{item.bscd},
                #{item.sccd},
                #{item.fzOld}
            /trim>
        /foreach>
        ) as t2(
        fq,
        qjq,
        fz,
        tm,
        scprod_id,
        bscd,
        sccd,
        fzOld
        )
        where t1.scprod_id=t2.scprod_id and t1.sccd=t2.sccd and t1.tm=t2.tm::timestamp without time zone
    /update>

执行以上sql语句报错:

### SQL: update resource_calc_scene_section_result t1          SET fq=t2.fq,             qjq=t2.qjq,             fz=t2.fz,             fz_old=t2.fzOld          from (         values                          ( ?,                 ?,                 ?,                 ?,                 ?,                 ?,                 ?,                 ? )                         , ( ?,                 ?,                 ?,                 ?,                 ?,                 ?,                 ?,                 ? )                         , ( ?,                 ?,                 ?,                 ?,                 ?,                 ?,                 ?,                 ? )                      ) as t2(         fq,         qjq,         fz,         tm,         scprod_id,         bscd,         sccd,         fzOld         )         where t1.scprod_id=t2.scprod_id and t1.sccd=t2.sccd and t1.tm=t2.tm::timestamp without time zone
### Cause: org.postgresql.util.PSQLException: 错误: 字段 "fz_old" 的类型为 numeric, 但表达式的类型为 text
  建议:你需要重写或转换表达式
  位置:134
; bad SQL grammar []

原因分析:

这个错误是因为 PostgreSQL 检测到类型不匹配:数据库表中 fz_old 字段是 numeric 类型,但你的 SQL 语句中传递的值被识别为 text 类型,是类型系统的问题。

解决方案:

1.显式类型转换:在 VALUES 子句中对 fzOld 进行类型转换。

update id="updateResourceCalcSceneSectionResult">
    update resource_calc_scene_section_result t1
    set>
        fq=t2.fq,
        qjq=t2.qjq,
        fz=t2.fz,
        fz_old=t2.fz_old
    set>
    from (
    values
    foreach collection="list" item="item" index="index" open="" close="" separator=",">
        trim prefix="(" suffix=")">
            #{item.fq},
            #{item.qjq},
            #{item.fz},
            #{item.tm},
            #{scprodId},
            #{item.bscd},
            #{item.sccd},
            #{item.fzOld,jdbcType=NUMERIC}  
        trim>
    foreach>
    ) as t2(
    fq,
    qjq,
    fz,
    tm,
    scprod_id,
    bscd,
    sccd,
    fz_old  
    )
    where t1.scprod_id=t2.scprod_id and t1.sccd=t2.sccd and t1.tm=t2.tm::timestamp
update>

关键修改点:

1.在 #{} 表达式中显式指定 jdbcType=NUMERIC,强制类型转换

2.将别名 fzOld 统一改为 fz_old(与表字段名保持一致)

3.移除了冗余的 without time zone 语法

4.其他建议:这种问题就是代码写的不规范,缺少类型信息,其实那些类型是应该全部都加上的 。参考其他示例代码:(批量入库)

    insert id="insertPlanSchemeProductionParamSchemeValList" parameterType="java.util.List">
        INSERT INTO plan_scheme_production_param_scheme_val
        ( pm_key, pm_val, row, psc_id, mtype_id, unitcd, prod_id)
        VALUES
        foreach collection="list" item="item" index="index" separator=",">
            (#{item.pmKey,jdbcType=VARCHAR}
            ,#{item.pmVal,jdbcType=VARCHAR}
            ,#{item.row,jdbcType=INTEGER}
            ,#{item.pscId,jdbcType=INTEGER}
            ,#{item.mtypeId,jdbcType=INTEGER}
            ,#{item.unitcd,jdbcType=VARCHAR}
            ,#{item.prodId,jdbcType=INTEGER}
            )
        /foreach>
    /insert>


自己的理解记录:
list循环的更新和入库,之后就参考这种,指定好类型,就不会报错了。
其实其他的几个对了,是因为你那写的都是0,理论上他也都是允许为空的;
因为你没写类型,然后刚好传过去的是null,代码自己是推算不出来是什么类型的,不知道是什么类型的时候,他就按照text字符串去处理,所以就报错了 。
你写的都是0的时候,代码字段推算类型的时候,他就知道是数值,碰巧对了 ;
只是碰巧代码自己蒙对了而已 ;
正确的方法,就是mysbatis里面 for循环list的这种sql,你要把所有的类型都加上对应的,就万无一失了。不然之后改为null的话,就又报错了 。

文章来源于互联网:【### Error updating database. Cause: org.postgresql.util.PSQLException: 错误: 字段 “fz_old“ 的类型为 numer】

相关推荐: Biomni: 你的生物医学研究超级助手

Biomni: 打开生物医学研究新世界的大门 在这个快速变化的科技时代,生物医学研究正迎来新的革命。人工智能的崛起让研究人员能够更快速、更精确地处理复杂数据,而Biomni就是这个革新浪潮中的佼佼者。作为一款通用的生物医学AI代理,Biomni被设计用来自动化…

赞(0)
未经允许不得转载:5bei.cn大模型教程网 » 【### Error updating database. Cause: org.postgresql.util.PSQLException: 错误: 字段 “fz_old“ 的类型为 numer】
分享到: 更多 (0)

AI大模型,我们的未来

小欢软考联系我们