在 jooq 的条件表达式中使用自定义数据类型

Posted

技术标签:

【中文标题】在 jooq 的条件表达式中使用自定义数据类型【英文标题】:Using custom data types in jooq's condition expression 【发布时间】:2021-09-22 18:35:41 【问题描述】:

我正在使用带有自定义绑定的 jooq,该绑定将所有 JTS 几何类型转换为适当的 Postgis 数据类型。这使我可以无缝地编写和读取 JTS 几何类型,但我无法使用相同的自定义类型执行查询。

例如,当我尝试将此条件添加到查询时:

Polygon polygon = geometryFactory.createPolygon(
  new Coordinate[]topLeftCorner, bottomLeftCorner, bottomRightCorner, topRightCorner, topLeftCorner
);
polygon.setSRID(4326);
DSL.condition("ST_WITHIN(0, 1)", USER.COORDINATES, polygon)

它失败并显示以下消息

org.jooq.exception.SQLDialectNotSupportedException: Type class org.locationtech.jts.geom.Polygon is not supported in dialect DEFAULT

【问题讨论】:

【参考方案1】:

使用 jOOQ 3.16

从 jOOQ 3.16 开始,#982 已经实现,并且 jOOQ 支持开箱即用的 ISO/IEC 13249-3:2016 空间扩展。例如,您生成的代码将引用 SQLDataType.GEOMETRY 类型,并且您可以在包装类型 org.jooq.Geometry 中使用 WKT 或 WKB 编码的空间数据,就像 jOOQ 中的任何其他数据类型一样。

A lot of spatial functions are already supported out of the box。如果仍然缺少某些内容,您可以随时使用plain SQL templating。

使用较旧的 jOOQ 版本

您需要为各种 GIS 类型创建 custom data type binding,然后是 attach that to your generated code(例如 ST_WITHIN 存储函数),或者创建使用绑定的辅助库方法,如下所示:

DataType<Polygon> polygonType = SQLDataType.OTHER.asConvertedDataType(binding);
Field<Polygon> bindValue = DSL.val(polygon, polygonType);
DSL.condition("ST_WITHIN(0, 1)", USER.COORDINATES, bindValue);

【讨论】:

以上是关于在 jooq 的条件表达式中使用自定义数据类型的主要内容,如果未能解决你的问题,请参考以下文章

如何:使用条件自定义背景视图作为背景修饰符?

Jooq 中的条件 onDuplicateKeyUpdate

JOOQ - 如何将 array_agg 与自定义类型字段一起使用

jOOQ & PostgreSQL:将从复杂 jsonb 中提取的嵌套 json 对象映射到自定义类型

JOOQ多字段自定义类型转换器

带有自定义绑定的 JOOQ 批量插入