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(插入、获取经纬度、按距离范围查询、按距离排序)?

如果创建CustomFieldCustomField 什么?因为jooq在Place表中生成的LOCATION字段是DataType&lt;Object&gt;类型的。

我已尝试执行插入设置 LOCATION 字段,但由于未为 Field&lt;Object&gt; 定义 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 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

通过JDBC处理数据库时如何处理夏令时?

如何处理数据库崩溃(Glassfish/MySQL)?

如何处理这个错误(1049,“未知数据库'/users/ohyunjun/work/astral/mysql'”)

如何处理 MySQL 数据库中的大量数据?

Mysql如何处理重复数据?让你的效率更高效

如何在 JOOQ 中公开新的 SQL 函数