使用标准JDBC读取MSSQL Geometry/Geography类型返回[B类报错
问题原因
[B是Java语言中byte[](字节数组)类型的内部类名标识,你遇到的报错本质是尝试把数据库返回的空间类型原生二进制数据,直接强转为驱动封装的Geometry类型,类型不匹配导致的。
写入时setObject生效、读取时getObject失效的具体逻辑:
- 写入阶段:微软SQL Server JDBC驱动对
setObject方法做了专属兼容处理,当检测到传入参数是WKT格式字符串、且数据库目标字段为Geometry/Geography类型时,驱动内部会自动完成WKT到空间类型存储格式的转换,所以可以正常执行。 - 读取阶段:JDBC规范本身没有定义空间数据类型的标准Java类型映射规则,微软驱动默认不会主动把返回的空间类型二进制数据反序列化为
com.microsoft.sqlserver.jdbc.Geometry类型,只会返回原生的字节数组对象,因此直接强转会抛出类转换异常。
兼容标准JDBC接口的解决方案
如果不想强转为SQLServerResultSet使用驱动专属的getGeometry方法,可以用两种方式处理:
- 手动反序列化返回的字节数组
// 先拿到原生二进制数据 byte[] geomRaw = (byte[]) rs.getObject(1); // 调用驱动提供的静态反序列化方法得到Geometry对象 Geometry geom = Geometry.deserialize(geomRaw);
- 查询时直接通过SQL函数转成WKT字符串返回
// 使用SQL Server内置的STAsText()方法把空间类型转成WKT文本 ResultSet rs = stmt.executeQuery("select geom_col.STAsText() as geom_wkt from " + tableName); String geomWkt = rs.getString("geom_wkt");
内容的提问来源于stack exchange,提问作者sproketboy
相关产品推荐
相关产品推荐

