定义VectorTypeHandler

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.postgresql.util.PGobject;

import java.sql.*;

public class VectorTypeHandler extends BaseTypeHandler<float[]> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i,
                                    float[] parameter, JdbcType jdbcType) throws SQLException {
        // 将float数组转换为PostgreSQL vector格式字符串
        PGobject vector = new PGobject();
        vector.setType("vector");
        vector.setValue(arrayToVectorString(parameter));
        ps.setObject(i,vector); ;
    }

    @Override
    public float[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return vectorStringToArray(rs.getString(columnName));
    }

    @Override
    public float[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return vectorStringToArray(rs.getString(columnIndex));
    }

    @Override
    public float[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return vectorStringToArray(cs.getString(columnIndex));
    }

    private String arrayToVectorString(float[] array) {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < array.length; i++) {
            if (i > 0) sb.append(",");
            sb.append(array[i]);
        }
        sb.append("]");
        return sb.toString();
    }

    private float[] vectorStringToArray(String vector) {
        if (vector == null || vector.isEmpty()) return null;
        String cleaned = vector.replace("[", "").replace("]", "");
        String[] parts = cleaned.split(",");
        float[] result = new float[parts.length];
        for (int i = 0; i < parts.length; i++) {
            result[i] = Float.parseFloat(parts[i].trim());
        }
        return result;
    }
}

注册VectorTypeHandler


    @Bean
    public ConfigurationCustomizer mybatisConfigurationCustomizer() {
        return configuration -> {
            configuration.getTypeHandlerRegistry()
                    .register(float[].class, new VectorTypeHandler());
        };
    }

定义Entity

注意加上 autoResultMap = true ===>>> @TableName(value =“text_vector”, autoResultMap = true)

@TableName(value ="text_vector", autoResultMap = true)
@Data
public class TextVector implements Serializable {
    /**
     * 主键
     */
    @TableId
    private String id;

    /**
     * 文本内容
     */
    private String content;

    /**
     * 向量值
     */
    @TableField(typeHandler = VectorTypeHandler.class)
    private float[] embedding;
}

总结

接下来你就可以进行数据存储与查询了

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐