You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jooq Multiset查询返回PostGIS坐标而非十六进制值的问题

解决Jooq Multiset查询PostGIS Geometry返回坐标而非十六进制的问题

问题根源在于:当使用Multiset生成JSON聚合查询时,PostgreSQL会自动将geometry类型序列化为GeoJSON坐标格式,而非触发你注册的自定义Binding返回十六进制值——因为JSON聚合操作在数据库层面完成,绕过了JDBC结果集层面的Binding处理。

解决方案:显式转换为十六进制字符串

在Multiset的子查询中,直接调用PostGIS的ST_AsHexEWKB函数将geometry字段转换为十六进制字符串,这样JSON聚合时会存储字符串值,而非坐标JSON。

修改后的Java查询代码

使用原生SQL函数方式:

dsl.select(GENERIC_EVENT.asterisk(),
    multiset(
             select(field("ST_AsHexEWKB({0})", String.class, LOCATIONS.LOCATION))
             .from(LOCATIONS)
             .where(LOCATIONS.EVENT_ID.eq(GENERIC_EVENT.ID))
    ))
    .from(GENERIC_EVENT)
    .fetch()

如果引入了jOOQ的PostGIS扩展依赖,可直接调用封装好的函数:

import org.jooq.impl.PostGIS;

dsl.select(GENERIC_EVENT.asterisk(),
    multiset(
             select(PostGIS.ST_ASHEXEWKB(LOCATIONS.LOCATION))
             .from(LOCATIONS)
             .where(LOCATIONS.EVENT_ID.eq(GENERIC_EVENT.ID))
    ))
    .from(GENERIC_EVENT)
    .fetch()

原理说明

通过ST_AsHexEWKB显式转换后,子查询返回的是字符串类型的十六进制值,JSON聚合时会直接保留该字符串,后续你的自定义Binding(或客户端逻辑)可以正常将其转换为对应的Java类型,避免了数据库自动序列化GeoJSON导致的类型转换错误。

内容的提问来源于stack exchange,提问作者jorge-plaza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:40:29