Explorar el Código

@
fix: String→jsonb 类型转换 — JsonbTypeHandler

ExpenseRuleEntity.conditionInfo 是 Java String,但 DB 列为 jsonb。
MyBatis-Plus 默认将 String 映射为 VARCHAR,与 jsonb 类型冲突。
新增 JsonbTypeHandler 包装为 PGobject("jsonb"),解决 INSERT/UPDATE。
@

alphaH hace 12 horas
padre
commit
d4558f318f

+ 45 - 0
java/src/main/java/com/payment/platform/common/handler/JsonbTypeHandler.java

@@ -0,0 +1,45 @@
+package com.payment.platform.common.handler;
+
+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;
+
+/**
+ * String ↔ PostgreSQL jsonb 类型转换器
+ * MyBatis-Plus 默认将 String 映射为 VARCHAR,与 jsonb 列类型冲突。
+ * 此 handler 将 String 值包装为 PGobject("jsonb"),解决 INSERT/UPDATE 时的类型转换问题。
+ */
+@MappedTypes(String.class)
+public class JsonbTypeHandler extends BaseTypeHandler<String> {
+
+    private static final String JSONB_TYPE = "jsonb";
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
+        PGobject pgObject = new PGobject();
+        pgObject.setType(JSONB_TYPE);
+        pgObject.setValue(parameter);
+        ps.setObject(i, pgObject);
+    }
+
+    @Override
+    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        return rs.getString(columnName);
+    }
+
+    @Override
+    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return rs.getString(columnIndex);
+    }
+
+    @Override
+    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return cs.getString(columnIndex);
+    }
+}

+ 4 - 1
java/src/main/java/com/payment/platform/module/payment/expense/entity/ExpenseRuleEntity.java

@@ -1,7 +1,9 @@
 package com.payment.platform.module.payment.expense.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.payment.platform.common.base.PaymentEnterpriseBaseEntity;
+import com.payment.platform.common.handler.JsonbTypeHandler;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -15,7 +17,7 @@ import java.math.BigDecimal;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@TableName("pay_expense_rule")
+@TableName(value = "pay_expense_rule", autoResultMap = true)
 public class ExpenseRuleEntity extends PaymentEnterpriseBaseEntity {
 
     /** 外部业务号 */
@@ -37,6 +39,7 @@ public class ExpenseRuleEntity extends PaymentEnterpriseBaseEntity {
     private String expenseTypeSubCategory;
 
     /** 规则条件 JSON — 对应 Python condition_info,存储 max_amount/week_days/time_ranges 等 */
+    @TableField(typeHandler = JsonbTypeHandler.class)
     private String conditionInfo;
 
     /** 单笔限额 */