關(guān)于向PostgreSQL數(shù)據(jù)庫插入Date類型數(shù)據(jù)報(bào)錯問題解決方案
1|0問題場景
這個是公司項(xiàng)目進(jìn)行更改,將項(xiàng)目的數(shù)據(jù)庫從Oracle版本改為PostgreSQL版本時(shí)發(fā)生的錯誤。
控制臺報(bào)錯內(nèi)容。
SQL: insert into table (...,RQ,...) select ...,?,... union all select ...,?,...
//(這里的...省略了其他字段, 主要是RQ日期類型報(bào)錯就沒列出)
Cause: org.postgresql.util.PSQLException: 錯誤: 字段 "rq" 的類型為 timestamp without time zone, 但表達(dá)式的類型為 text
建議:你需要重寫或轉(zhuǎn)換表達(dá)式 位置: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 這里當(dāng)時(shí)是將項(xiàng)目Oracle數(shù)據(jù)庫轉(zhuǎn)為PostgreSQL數(shù)據(jù)庫
</foreach>
</insert>對應(yīng)的實(shí)體類為
@Data
public class Entity {
// 省略
private Date rq;
// 省略
}當(dāng)在插入數(shù)據(jù)到數(shù)據(jù)庫的時(shí)候就會報(bào)字段RQ類型錯誤的問題,但是通過檢查sql語句后并沒有發(fā)現(xiàn)明顯的錯誤。
雖然控制臺報(bào)錯了,但還是能插入幾條數(shù)據(jù)到數(shù)據(jù)庫中,然后就報(bào)錯不能插入了。這個時(shí)候考慮到有可能插入數(shù)據(jù)的問題,但是這里設(shè)置了#{item.rq,jdbcType=TIMESTAMP},數(shù)據(jù)類型也是符合PostgreSQL數(shù)據(jù)庫的日期類型timestamp的,所以也不是這個的問題。
這個時(shí)候我將數(shù)據(jù)庫中的數(shù)據(jù)清除,重新執(zhí)行了幾遍程序后發(fā)現(xiàn)有時(shí)候能夠向數(shù)據(jù)庫中插入幾條數(shù)據(jù),然后就報(bào)錯,有時(shí)候一條數(shù)據(jù)都沒有插入就報(bào)錯了,很是奇怪。
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ù)庫中是能夠正常的運(yùn)行的,有可能在PostgreSQL數(shù)據(jù)庫存在兼容的問題,所以改成了在使用Mysql數(shù)據(jù)庫時(shí)常寫的動態(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í)行程序后,沒有報(bào)錯,數(shù)據(jù)正常插入,完美解決!
到此這篇關(guān)于向PostgreSQL數(shù)據(jù)庫插入Date類型數(shù)據(jù)報(bào)錯的文章就介紹到這了,更多相關(guān)向PostgreSQL數(shù)據(jù)庫插入Date類型數(shù)據(jù)報(bào)錯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostgreSQL時(shí)間相差天數(shù)代碼實(shí)例
PostgreSQL是一款簡介而又性能強(qiáng)大的數(shù)據(jù)庫應(yīng)用程序,其在日期時(shí)間數(shù)據(jù)方面所支持的功能也都非常給力,這篇文章主要給大家介紹了關(guān)于PostgreSQL時(shí)間相差天數(shù)的相關(guān)資料,需要的朋友可以參考下2023-11-11
PostgreSQL存儲過程循環(huán)調(diào)用方式
這篇文章主要介紹了PostgreSQL存儲過程循環(huán)調(diào)用方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL如何查詢表大小(單獨(dú)查詢和批量查詢)
PostgreSQL提供了多個系統(tǒng)管理函數(shù)來查看表,索引表空間及數(shù)據(jù)庫的大小,這篇文章主要給大家介紹了關(guān)于PostgreSQL如何查詢表大小的相關(guān)資料,文中介紹的方法包括單獨(dú)查詢和批量查詢,需要的朋友可以參考下2024-02-02
PostgreSQL中的template0和template1庫使用實(shí)戰(zhàn)
這篇文章主要介紹了PostgreSQL中的template0和template1庫使用實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL運(yùn)維案例之遞歸查詢死循環(huán)解決方案
PostgreSQL提供的遞歸語法是很棒的,例如可用來解決樹形查詢的問題,解決Oracle用戶connect by的語法兼容性,下面這篇文章主要給大家介紹了關(guān)于PostgreSQL運(yùn)維案例之遞歸查詢死循環(huán)解決方案的相關(guān)資料,需要的朋友可以參考下2024-02-02
PostgreSQL進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出的操作代碼
在數(shù)據(jù)庫管理中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是非常常見的操作,特別是在 PostgreSQL 中,提供了多種工具和方法來實(shí)現(xiàn)數(shù)據(jù)的有效管理,本文將詳細(xì)介紹在 PostgreSQL 中如何進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出,并給出具體的命令及示例,需要的朋友可以參考下2024-10-10
用PostgreSQL數(shù)據(jù)庫做地理位置app應(yīng)用
項(xiàng)目中用到了postgreSQL中的earthdistance()函數(shù)功能計(jì)算地球上兩點(diǎn)之間的距離,中文的資料太少了,我找到了一篇 英文的、講的很好的文章,特此翻譯,希望能夠幫助到以后用到earthdistance的同學(xué)2014-03-03

