在 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 与自定义类型字段一起使用