queryexception尝试插入地理位置数据

6yoyoihd  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(643)

在尝试向包含地理位置数据的表中插入条目时遇到问题。实际上,该表只包含一个地理位置列,即点数据类型。我正在使用javajpa和mariadb。最奇怪的是,代码以前是可以工作的,但应用程序正在开发中,现在,在 git merge ,它不再工作了,即使与这个地理位置实体相关的代码都没有被合并的代码修改过,所以我不知道为什么它不再工作了。
我得到的错误是:
2018-12-11 03:15:21.008警告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]o.h.engine.jdbc.spi.sqlexceptionhelper:(conn:1569)无法从发送到“几何体”字段的数据中获取几何体对象
查询是:插入本地化(关联的用户id、城市、补码、坐标X、坐标Y、邻里、号码、点、公共场所、公共场所类型、州、邮政编码、id)值(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?),参数[,'fortaleza',''',-3.7605171,-38.5738463999998,'jó奎克吕贝 ','2307',<bytearray:��
这个<bytearray:�� 应为点字段的值。
我使用以下方法保存数据:

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

下面是my 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中的配置。spring log说:
找不到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'cannot be null”。同样的情况也发生在 ST_PointFromWKB(?1,?2) 我勒个去?
更新2:我可以按照下面的提示强制使用方言mysql5innodbdialect:https://stackoverflow.com/a/44472411/3435735.
但这并没有改变什么,我仍然从函数中得到null ST_PointFromText('POINT (?1 ?2)') 以及 ST_PointFromWKB(?1,?2) . 我肯定会通过辩论。
最后更新:我能够解决这个问题,虽然我不知道具体是如何解决的,我甚至不知道为什么它工作,然后停止。但我所做的只是让代码保持问题出现之前的状态,而不使用本机查询,确保已在pom.xml中加载lib hibernate spatial,并设置配置 spring.jpa.properties.hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect 在application.yml中,自 spring.jpa.hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect 显然是不正确的。

vm0i2vca

vm0i2vca1#

This <bytearray:�� should be the value of the Point field.
``` `POINT` 是二进制类型。不能使用字符;你必须使用一些十六进制或一些转义机制。
听起来像 `git` 是文本混乱的中心。
每个人和他的弟弟都想用不简单的ascii码做有趣的事情。带问号的黑色菱形是一个“替换”字符——当期望使用utf-8的人得到的编码不是utf-8时,它就会出现。原始数据丢失。
既然你暗示数据是通过几只手传递的,我(从这里)甚至不敢猜测它是什么时候被破坏的。
请特别注意 `Point` 是“二进制”编码(又名“bytearray”),所以需要做一些事情来保护它不受损坏。有些用十六进制,有些用base64。显然,某个步骤未能做到这一点,从而让随后的某个步骤抛出utf-8指针并生成这些字符。

相关问题