【问题标题】:jooq: How to deal with POINT MySQL datatypejooq:如何处理 POINT MySQL 数据类型
【发布时间】: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() 方法,因此无法编译。

【问题讨论】:

    标签: mysql jooq


    【解决方案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 templatingcustom data type bindings 是您唯一的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 2015-12-13
      • 1970-01-01
      • 2018-03-18
      • 2015-08-29
      • 1970-01-01
      • 2021-11-05
      相关资源
      最近更新 更多