pgsql數據庫表字段設置了jsonb格式;在java的實體里使用String或者對象轉換會一直提示一個錯誤:
Caused by: org.postgresql.util.PSQLException: ERROR: column “xx” is of type jsonb but expression is of type character varying
需要加一個轉換方法:
String類型的
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;import java.sql.*;/*** PGJsonTypeHandler:處理Object對象類型與postgresql中JSONB類型之間的轉換* 使用方式* @TableField(typeHandler = PGJsonbStringTypeHandler.class)* private String content;** @author :lzy* @date :2025/8/4 10:04*/
@MappedTypes(String.class)
public class PGJsonbStringTypeHandler extends BaseTypeHandler<String> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {PGobject pgObject = new PGobject();pgObject.setType("jsonb");pgObject.setValue(parameter); // 這里已經是 JSON 字符串ps.setObject(i, pgObject);}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {return rs.getString(columnName); // 返回 JSON 字符串}@Overridepublic String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return rs.getString(columnIndex);}@Overridepublic String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return cs.getString(columnIndex);}
}
泛型的
import com.alibaba.fastjson.JSON;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedTypes;
import org.postgresql.util.PGobject;import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** PGJsonbTypeHandler 是泛型的,但沒有指定類型參數傳入* @author :lzy* @date :2025/8/4 10:13*/
@MappedTypes(value = {Object.class})
public class PGJsonbTypeHandler<T> extends BaseTypeHandler<T> {private final Class<T> clazz;public PGJsonbTypeHandler(Class<T> clazz) {this.clazz = clazz;}@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {PGobject pgObject = new PGobject();pgObject.setType("jsonb");pgObject.setValue(JSON.toJSONString(parameter));ps.setObject(i, pgObject);}@Overridepublic T getNullableResult(ResultSet rs, String columnName) throws SQLException {return JSON.parseObject(rs.getString(columnName), clazz);}@Overridepublic T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {return JSON.parseObject(rs.getString(columnIndex), clazz);}@Overridepublic T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {return JSON.parseObject(cs.getString(columnIndex), clazz);}
}