1、場景說明:
pgsql裡面description字段類型為jsonb,需要在代碼裡面自定義類型轉換器,便于直接存取
2、代碼
/*
1、Model:必須要有無參構造方法,否則會導緻填充值的時候報錯
順序:先new對象,然後調用set方法
*/
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class LanguageModel {
/**
* 英文
*/
private String language_en;
/**
* 中文
*/
private String language_zh;
public static LanguageModel getModel(String str){
return new LanguageModel(str,str);
}
}
/*
1.實體類:關鍵直接:@TableName和@TableField
@TableName必須帶上autoResultMap = true,否則在自定義類型轉換裡面不會進入到getNullableResult()這個方法裡面
@TableField指定類型轉換器
*/
@Data
@Accessors(chain = true)
@TableName(value = "security_vulnerability_category",autoResultMap = true)
public class SecurityVulnerabilityCategoryEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 連結
*/
@TableField("code")
private String code;
/**
* 描述
*/
@TableField(value = "description", typeHandler = LanguageModelTypeHandler.class)
private LanguageModel description;
@TableField(value = "create_at")
private Date createAt;
@TableField(value = "update_at", update = "now()")
private Date updateAt;
}
/*
3.類型轉換器
*/
@MappedTypes(PGobject.class)
@MappedJdbcTypes({JdbcType.OTHER})
public class LanguageModelTypeHandler extends AbstractJsonbTypeHandler{
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
return JsonUtil.fromJson(rs.getString(columnName), LanguageModel.class);
}
}
public abstract class AbstractJsonbTypeHandler extends BaseTypeHandler<Object> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
PGobject jsonObject = new PGobject();
jsonObject.setType("jsonb");
jsonObject.setValue(JsonUtil.toJsonString(parameter));
ps.setObject(i, jsonObject);
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getString(columnIndex);
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getString(columnIndex);
}
@Override
public abstract Object getNullableResult(ResultSet rs, String columnName) throws SQLException;
}
3、核心點
- @TableField(typeHandler = MyGeometryTypeHandler.class)通過攔截的方法攔截轉換字段
- @TableName(value = “tland”, autoResultMap = true)如果不加autoResultMap =rue,進不去自定義類型轉換器中getNullableResult()這個方法,就會導緻無法将二進制轉回到坐标點。