關(guān)于向PostgreSQL數(shù)據(jù)庫插入Date類型數(shù)據(jù)報錯問題解決方案
1|0問題場景
這個是公司項目進行更改,將項目的數(shù)據(jù)庫從Oracle版本改為PostgreSQL版本時發(fā)生的錯誤。
控制臺報錯內(nèi)容。
SQL: insert into table (...,RQ,...) select ...,?,... union all select ...,?,...
//(這里的...省略了其他字段, 主要是RQ日期類型報錯就沒列出)
Cause: org.postgresql.util.PSQLException: 錯誤: 字段 "rq" 的類型為 timestamp without time zone, 但表達式的類型為 text
建議:你需要重寫或轉(zhuǎn)換表達式 位置:404
mapper文件中的動態(tài)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數(shù)據(jù)庫轉(zhuǎn)為PostgreSQL數(shù)據(jù)庫 </foreach> </insert>
對應(yīng)的實體類為
@Data public class Entity { // 省略 private Date rq; // 省略 }
當在插入數(shù)據(jù)到數(shù)據(jù)庫的時候就會報字段RQ類型錯誤的問題,但是通過檢查sql語句后并沒有發(fā)現(xiàn)明顯的錯誤。
雖然控制臺報錯了,但還是能插入幾條數(shù)據(jù)到數(shù)據(jù)庫中,然后就報錯不能插入了。這個時候考慮到有可能插入數(shù)據(jù)的問題,但是這里設(shè)置了#{item.rq,jdbcType=TIMESTAMP}
,數(shù)據(jù)類型也是符合PostgreSQL數(shù)據(jù)庫的日期類型timestamp的,所以也不是這個的問題。
這個時候我將數(shù)據(jù)庫中的數(shù)據(jù)清除,重新執(zhí)行了幾遍程序后發(fā)現(xiàn)有時候能夠向數(shù)據(jù)庫中插入幾條數(shù)據(jù),然后就報錯,有時候一條數(shù)據(jù)都沒有插入就報錯了,很是奇怪。
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數(shù)據(jù)庫的語法 </foreach> </insert>
但這樣每個日期的字段都要加上這個,更改起來很麻煩,所以我在想有沒有更好的解決方案。
后面我更改了這一條批量插入的動態(tài)sql。由于這個sql在Oracle數(shù)據(jù)庫中是能夠正常的運行的,有可能在PostgreSQL數(shù)據(jù)庫存在兼容的問題,所以改成了在使用Mysql數(shù)據(jù)庫時常寫的動態(tài)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>
重新執(zhí)行程序后,沒有報錯,數(shù)據(jù)正常插入,完美解決!
到此這篇關(guān)于向PostgreSQL數(shù)據(jù)庫插入Date類型數(shù)據(jù)報錯的文章就介紹到這了,更多相關(guān)向PostgreSQL數(shù)據(jù)庫插入Date類型數(shù)據(jù)報錯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
postgresql?IvorySQL新增命令及相關(guān)配置參數(shù)詳解
這篇文章主要為大家介紹了postgresql?IvorySQL新增命令及相關(guān)配置參數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12