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

Using custom data types in jooq's condition expression

我将 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

使用 jOOQ 3.16

从 jOOQ 3.16 开始,#982 has been implemented and jOOQ supports 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. If something is still missing, you can always resort to using plain SQL templating.

使用旧的 jOOQ 版本

您需要创建一个 custom data type binding for your various GIS types, and then either 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);