项目场景:
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就是这个革新浪潮中的佼佼者。作为一款通用的生物医学AI代理,Biomni被设计用来自动化…
5bei.cn大模型教程网










