소스 검색

fix: handle pgvector embedding inserts via type handler

Use PostgreSqlVectorTypeHandler for vector_embeddings.embedding
and enable autoResultMap so pgvector values are bound correctly.
何文松 1 개월 전
부모
커밋
68adde388f

+ 49 - 0
backend/common/src/main/java/com/lingyue/common/mybatis/PostgreSqlVectorTypeHandler.java

@@ -0,0 +1,49 @@
+package com.lingyue.common.mybatis;
+
+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.PGobject;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * PostgreSQL pgvector 类型处理器
+ * 
+ * 负责将向量字符串写入 pgvector 类型列。
+ *
+ * @author lingyue
+ * @since 2026-01-17
+ */
+@MappedTypes({String.class})
+@MappedJdbcTypes(JdbcType.OTHER)
+public class PostgreSqlVectorTypeHandler extends BaseTypeHandler<String> {
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
+            throws SQLException {
+        PGobject pgObject = new PGobject();
+        pgObject.setType("vector");
+        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);
+    }
+}

+ 3 - 2
backend/graph-service/src/main/java/com/lingyue/graph/entity/VectorEmbedding.java

@@ -3,6 +3,7 @@ package com.lingyue.graph.entity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.lingyue.common.domain.entity.SimpleModel;
+import com.lingyue.common.mybatis.PostgreSqlVectorTypeHandler;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -16,7 +17,7 @@ import lombok.EqualsAndHashCode;
  */
 @EqualsAndHashCode(callSuper = true)
 @Data
-@TableName("vector_embeddings")
+@TableName(value = "vector_embeddings", autoResultMap = true)
 @Schema(description = "向量嵌入实体")
 public class VectorEmbedding extends SimpleModel {
 
@@ -25,7 +26,7 @@ public class VectorEmbedding extends SimpleModel {
     private String chunkId;
 
     @Schema(description = "向量嵌入(pgvector格式字符串)")
-    @TableField("embedding")
+    @TableField(value = "embedding", typeHandler = PostgreSqlVectorTypeHandler.class)
     private String embedding;
 
     @Schema(description = "使用的嵌入模型名称")