mybatisPlus 整合 postgresql的timestamp轉換問題

數據庫表字段類型爲timestampzone時,mybatis是無法將timestampz轉成localDatetime。

錯誤信息如下:

Cannot convert the column of type TIMESTAMPTZ to requested type timestamp

解決方法如下:

定義類型轉換handler  

TimestampTypeHandler.java


import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGTimestamp;

import java.sql.*;
import java.time.LocalDateTime;

@MappedTypes({LocalDateTime.class})
@MappedJdbcTypes({JdbcType.OTHER})
public class TimestampTypeHandler extends BaseTypeHandler {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        Timestamp p=null;
        if(parameter!=null) {
            if (parameter instanceof LocalDateTime) {PGTimestamp.valueOf(LocalDateTime.now());
                p = PGTimestamp.valueOf((LocalDateTime)parameter);
            }
            ps.setObject(i, p);
        }
    }

    /**
     * Gets the nullable result.
     *
     * @param rs         the rs
     * @param columnName Colunm name, when configuration <code>useColumnLabel</code> is <code>false</code>
     * @return the nullable result
     * @throws SQLException the SQL exception
     */
    @Override
    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return toFill(rs.getObject(columnName));
    }

    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return toFill(rs.getObject(columnIndex));
    }

    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return toFill(cs.getObject(columnIndex));
    }
    private Object toFill(Object v){
        if(v!=null) {
            if (v instanceof PGTimestamp) {
                PGTimestamp p = (PGTimestamp) v;
                return p.toLocalDateTime();
            } else if (v instanceof Timestamp) {
                return ((Timestamp) v).toLocalDateTime();
            }
        }
        return v;
    }
}

對model類設置如下:

User.java

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.List;

import lombok.Data;
import lombok.experimental.Accessors;

/**
 * 用戶
 * @TableName uc_user
 */
@TableName(value ="uc_user",autoResultMap = true)
@Accessors(chain = true)
@Data
public class UcUser implements Serializable {
    /**
     * id
     */
    @TableId
    private Long id;
    /**
     * 創建時間
     */
    @TableField(typeHandler = TimestampTypeHandler.class)
    protected LocalDateTime createTime;
    /**
     * 創建人id
     */
    protected Long creatorId;
    protected String creatorName;

    private String fullName;
}

 

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