【问题标题】:QueryException trying to insert geolocation dataQueryException 试图插入地理位置数据
【发布时间】:2019-05-12 02:11:00
【问题描述】:

我在尝试将条目插入到包含地理位置数据的表中时遇到了问题。实际上,该表仅包含一个地理位置列,即 Point 数据类型。我正在使用 Java JPA 和 MariaDB。最奇怪的部分是代码过去可以工作,但应用程序正在开发中,现在,在git merge 之后,它不再工作了,即使与此地理定位实体相关的代码都没有被合并代码修改,所以我不知道为什么它不再起作用了。

我得到的错误是:

2018-12-11 03:15:21.008 WARN 16710 --- [nio-8080-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:1416,SQLState:22003

2018-12-11 03:15:21.008 错误 16710 --- [nio-8080-exec-5] ohengine.jdbc.spi.SqlExceptionHelper : (conn:1569) 无法从您发送到的数据中获取几何对象GEOMETRY 字段

查询是:插入本地化(关联用户 ID、城市、补语、坐标 x、坐标、社区、数字、点、公共场所、公共场所类型、州、邮政编码、ID)值(?、?、?、?、?、?, ?, ?, ?, ?, ?, ?, ?), 参数 [,'Fortaleza','',-3.7605171,-38.57384639999998,'Jóquei Clube','2307',

这个

我正在使用以下方法保存数据:

public Location addLocation(Location location){
    location.setPoint(new Point(location.getCoordX(),location.getCoordY()));
    return locationRepository.saveAndFlush(location);
}

下面是我的application.yml,配置和代码停止工作前一样。

server.port: 8080
server.context-path: /api

spring:
  datasource:
    url: jdbc:mariadb://localhost:3306/api
    driverClassName: org.mariadb.jdbc.Driver
    username: root
    password: root
  jpa:
    hibernate:
      ddl-auto: create
      dialect: org.hibernate.dialect.MySQL5InnoDBDialect
      hbm2ddl.auto: update
      show_sql: true

logging:
   level: 
      org.springframework: ERROR

现在,我找到了使用 dialect 配置和值 org.hibernate.spatial.dialect.mysql.MySQL5InnoDBSpatialDialect 的答案,但不幸的是,这对我没有帮助。现在我没有想法了。我不认为问题出在 application.yml 配置中,因为以前使用相同的配置。

感谢您的帮助,

谢谢,

更新: 深入挖掘,我发现所有表都是为 MyISAM 创建的,而不是为 InnoDB 创建的,而且显然 hibernate 没有检测 application.yml 中的配置。春季日志说:

找不到hibernate.properties

使用方言:org.hibernate.dialect.MySQL5Dialect

顺便说一句,我可以直接在 mysql 控制台中使用以下命令插入:

INSERT INTO location (zip_code,state,city,number,neighbourhood,public_place_type,public_place,coordx,coordy,point) 
VALUES ('60510430','ce','fortaleza','2307','jóquei','avenida','carneiro de mendonca',55.2918681,-20.9388982,ST_GeomFromText('POINT(55.2918681 -20.9388982)'));

但在尝试使用 Java 中的该查询时,使用本机查询仍然没有游戏。插入现在正在工作,但函数ST_PointFromText('POINT (?1 ?2)') 总是将列值设置为空,如果我将点列设置为非空,插入会给出“列'点'不能为空”。 ST_PointFromWKB(?1,?2) 也一样,这到底是怎么回事?

更新 2:我能够按照此处的提示强制使用方言 MySQL5InnoDBDialect:https://stackoverflow.com/a/44472411/3435735

但这并没有改变任何东西,我仍然从函数 ST_PointFromText('POINT (?1 ?2)')ST_PointFromWKB(?1,?2) 得到 null。而且我肯定会通过这些论点。


最终更新:我能够解决这个问题,虽然我不知道具体是怎么做的,而且我更不知道它为什么会工作然后停止。但是我所做的只是让代码保持问题出现之前的样子,不使用本机查询,确保我已经在 pom.xml 中加载了 lib hibernate-spatial,并在 application.yml 中设置了配置spring.jpa.properties.hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect,因为spring.jpa.hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect 显然是不正确的。

【问题讨论】:

    标签: mysql jdbc geolocation spring-data-jpa mariadb


    【解决方案1】:
    This <bytearray:�� should be the value of the Point field.
    

    POINT 是二进制类型。你不能使用字符;你必须使用一些十六进制或一些转义机制。

    听起来git 是文本混乱的中心。

    每个人和他的弟弟都想用不简单的 Ascii 字节做有趣的事情。带有问号的黑色菱形是一个“替换”字符——当有人期望 UTF-8 得到一个不是 UTF-8 的编码时,它就会出现。原始数据丢失。

    由于您暗示数据已通过数人之手传递,因此(从这里)我什至无法猜测它何时被破坏。

    请特别注意,Point 是“二进制”编码(又名“bytearray”),因此需要采取措施保护它免受损坏。有些使用十六进制,有些使用 Base64。显然某些步骤未能做到这一点,从而让后续步骤抛出其 UTF-8 手并生成这些字符。

    【讨论】:

    • 嗨瑞克!你是什​​么意思,不能使用字符?实际上,在这种情况下,JPA 正在管理 SQL 查询。我应该手动查询吗?
    • @heniotierra - 我又添加了几段。
    • 我能够解决这个问题,虽然我不知道具体如何。我的意思是,我只是保留了问题之前的代码,确保加载 lib hibernate-spatial,并将 application.yml 中的配置 spring.jpa.properties.hibernate.dialect 设置为 org.hibernate.dialect.MySQL5InnoDBDialect
    • 感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多