QueryException尝试插入地理位置数据

时间:2018-12-11 05:53:46

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

尝试在包含地理位置数据的表中插入条目时遇到麻烦。实际上,该表仅包含一个地理位置列,即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)无法从发送到的数据获取几何对象几何字段

     

查询是:插入本地化值(associated_user_id,城市,补码,coordx,coordy,邻居,数字,点,public_place,public_place_type,州,邮政编码,id)值(?,?,?,?,?,?, ?,?,?,?,?,?,?,?),参数[,'Fortaleza','',-3.7605171,-38.57384639999998,'JóqueiClube','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创建的,并且显然休眠状态未检测到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)')始终将列值设置为null,如果将Point列设置为NOT NULL,则插入将给出“ Column'point'不能为null”。 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显然是错误的。

1 个答案:

答案 0 :(得分:0)

This <bytearray:�� should be the value of the Point field.

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

听起来git是文字修饰的中心。

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

由于您已经暗示数据已通过多只手传递,所以我(从这里)甚至无法冒险猜测数据何时被篡改。

请特别注意,Point是“二进制”编码(也称为“字节数组”),因此需要采取一些措施来防止其被破坏。有些使用十六进制,有些使用Base64。显然,某个步骤无法执行此操作,因此让后续步骤可以举起其UTF-8手并生成那些字符。