【发布时间】: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() 方法,因此无法编译。
【问题讨论】: