column “XXXX” is of type timestamp without time zone but expression is of type character varying

1.問題

在使用MyBatis向PostgreSQL數據庫動態更新數據,參數爲表名和json(列:值),爲了避免對列進行類型校驗,在mybatis中統一將值作爲字符串處理(數據庫對sql中類型檢查減弱,如向int類型的列插入值時寫成'1',仍然能夠插入成功,向Date類型的列插入'2020-01-01'字符串也是OK的)。

mapper接口如下:

/**
     * 根據條件更新數據
     * @param schema schema值
     * @param tableName 表名
     * @param dataMap 更新數據的值
     * @param conditionMap 更新條件
     * @return 操作結果
     */
    int updateProperty(@Param("schema") String schema,
                        @Param("tableName") String tableName,
                       @Param("dataMap")Map<String,Object> dataMap,
                        @Param("conditionMap") Map<String,Object> conditionMap);

對應mapper.xml中的寫法如下:

<update id="updateProperty">
        update ${schema}.${tableName} set
        <foreach collection="dataMap.keys" item="key" separator=",">
            ${key} = #{dataMap[${key}]}
        </foreach>
        <where>
            <foreach collection="conditionMap.keys" item="key" separator="and">
                ${key} = #{conditionMap[${key}]}
            </foreach>
        </where>
    </update>

使用postman對數據進行請求,請求體如下:

{
  "condition": "{'objectid':1866}",
  "details": "{'fzsj':'2019-09-26'}",
  "layerName": "fz"
}

fzsj是Date類型

在執行時數據庫報錯,錯誤信息如下:

column “fzsj” is of type timestamp without time zone but expression is of type character varying

2.解決方案

在最初實現該功能時考慮過使用Java代碼拼接成sql,這樣能夠根據查詢到的數據表列的字段類型來動態拼接,也能有使用一些數據庫函數,在遇到該問題的時候也想使用這種方式解決,但時間日期類型的字符串格式多種多樣,在使用一些數據庫函數將字符串轉成日期時需要指定其格式,這樣的話就需要對日期字符串做各種格式的校驗和轉換。

在配置文件對jdbc配置時只需要如下配置即可

jdbc:postgresql://localhost:5432/dbname?stringtype=unspecified

stringtype=unspecified即自動格式化數據。

 

此配置對於一些數據庫的操作也會有一些影響,官方文檔中有說明

https://www.postgresql.org/message-id/[email protected]

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章