jooq:如何处理 POINT MySQL 数据类型
Posted
技术标签:
【中文标题】jooq:如何处理 POINT MySQL 数据类型【英文标题】:jooq: How to deal with POINT MySQL datatype 【发布时间】:2014-04-03 16:24:29 【问题描述】:我在 mysql 中有下表
CREATE TABLE `place` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`NAME` varchar(255) DEFAULT NULL,
`STREET_NUMBER` int(11) DEFAULT NULL,
`ROUTE` varchar(255) DEFAULT NULL,
`LOCALITY` varchar(255) DEFAULT NULL,
`ADM_AREA_L1` varchar(255) DEFAULT NULL,
`ADM_AREA_L2` varchar(255) DEFAULT NULL,
`COUNTRY` varchar(100) DEFAULT NULL,
`POSTAL_CODE` varchar(10) DEFAULT NULL,
`FORMATTED_ADDRESS` varchar(1000) DEFAULT NULL,
`LOCATION` point DEFAULT NULL,
`CLOSING_TIME` time DEFAULT NULL,
`CREATION_DATE` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
它有一个 POINT 类型的字段,用于对该字段进行地理定位查询。 jooq生成的pojo如下:
public class Place implements java.io.Serializable
private static final long serialVersionUID = -1847682719;
private java.lang.Long id;
private java.lang.String name;
private java.lang.Integer streetNumber;
private java.lang.String route;
private java.lang.String locality;
private java.lang.String admAreaL1;
private java.lang.String admAreaL2;
private java.lang.String country;
private java.lang.String postalCode;
private java.lang.String formattedAddress;
private java.lang.Object location;
private java.sql.Time closingTime;
// getters and setters
这是我想要执行的查询类型:
插入一条新记录。 POINT 数据类型的 sql 将是:
INSERT INTO PLACE(LOCATION) VALUES(POINT(1,1));
从 POINT 数据类型获取纬度和经度。 sql 将是:
SELECT X(LOCATION), Y(LOCATION) FROM PLACE;
查询距离范围内的地方。 sql 将是:
SELECT *
FROM PLACE
WHERE ST_WITHIN(LOCATION, ENVELOPE(LINESTIRNG(
POINT(@lon - @distance / abs(cos(radians(@lat)) * 69), @lat - (@distance / 69)),
POINT(@lon + @distance / abs(cos(radians(@lat)) * 69), @lat + (@distance / 69))
)))
ORDER BY ST_DISTANCE(POINT(<lon>, <lat>), LOCATION);
我是否必须为每种情况创建一个CustomField
(插入、获取经纬度、按距离范围查询、按距离排序)?
如果创建CustomField
。 CustomField
什么?因为jooq在Place
表中生成的LOCATION
字段是DataType<Object>
类型的。
我已尝试执行插入设置 LOCATION
字段,但由于未为 Field<Object>
定义 execute()
方法,因此无法编译。
【问题讨论】:
【参考方案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
在旧版本的 jOOQ 中,plain SQL templating 和 custom data type bindings 是您唯一的选择。
【讨论】:
以上是关于jooq:如何处理 POINT MySQL 数据类型的主要内容,如果未能解决你的问题,请参考以下文章