mybatis使用pgvector
·
定义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;
}
总结
接下来你就可以进行数据存储与查询了
更多推荐

所有评论(0)