postgresql Jooq Multiset使用Postgis几何坐标而不是十六进制值生成SQL查询

wf82jlnq  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(154)

我正在使用multiset构造函数来获取事件的相关位置集。位置表使用几何Postgis类型,所以我可以抽象它,如果它是一个点,线或面积,将其保存为十六进制表示。
这是表定义

CREATE TABLE events.locations(
    id bigint not null PRIMARY KEY,
    event_id varchar not null references events.generic_event(id),
    location geometry not null
);

这是一个样本内容
| id|事件ID|位置|
| - -----|- -----|- -----|
| 1| 1| 01010000007432F387985F434064E6BB885C4C3BC0|
| 2| 1| 0101000000059415A95C9145406CEA0B7D9C3238C0|
当我运行这个选择和嵌套的多重集时

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

Jooq生成这个查询

select "events"."generic_event".*,
       (select coalesce(jsonb_agg(jsonb_build_array("v0")), jsonb_build_array())
            from (
                select "events"."locations"."location" as "v0"
                from "events"."locations"
                where "events"."locations"."event_id" = "events"."generic_event"."id"
            ) as "t"
        ) 
from "events"."generic_event";

使用事件ID和位置作为json查询结果

[[{""type"": ""Point"", ""coordinates"": [41.64214096573672, -4.777311334633507]}], [{""type"": ""Point"", ""coordinates"": [41.64778522299253, -4.710878384400815]}], [{""type"": ""Point"", ""coordinates"": [38.746842378376556, -27.29828695857431]}], [{""type"": ""Point"", ""coordinates"": [43.13564027360557, -24.19770032444869]}]]

我的问题是我将几何类型存储为十六进制字符串,并且我希望以相同的方式获取它,因为我已经注册了一个自定义绑定来使用十六进制。对于只获取几何体的查询,它工作得很好,我得到了十六进制,但是对于多集,生成的查询返回坐标,所以当绑定器试图构建java类型时,我得到了一个错误。
有什么方法可以克服这个问题吗?

zf9nrax1

zf9nrax11#

此错误已在jOOQ 3.18.0和3.17.6中修复,以在MULTISET模拟中添加对GEOMETRY类型的支持:

请注意,GEOMETRY支持是商业jOOQ版本的一个特性,所以这个bug修复在jOOQ开源版中不可用。

相关问题