gpt4 book ai didi

mysql - 尝试插入地理位置数据时出现 QueryException

转载 作者:行者123 更新时间:2023-11-29 16:34:06 28 4
gpt4 key购买 nike

我在尝试将条目插入包含地理位置数据的表时遇到问题。事实上,该表仅包含一个地理位置列,一种 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 Error: 1416, SQLState: 22003

2018-12-11 03:15:21.008 ERROR 16710 --- [nio-8080-exec-5] o.h.engine.jdbc.spi.SqlExceptionHelper : (conn:1569) Cannot get geometry object from data you send to the GEOMETRY field

Query is: insert into localizations (associated_user_id, city, complement, coordx, coordy, neighbourhood, number, point, public_place, public_place_type, state, zip_code, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?), parameters [,'Fortaleza','',-3.7605171,-38.57384639999998,'Jóquei Clube ','2307',<bytearray:��

这个

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

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 中的配置。 Spring 日志说:

hibernate.properties not found

Using dialect: 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)'));

但是当尝试使用 native 查询从 Java 中使用该查询时仍然没有游戏。插入现在正在工作,但函数 ST_PointFromText('POINT (?1 ?2)') 始终将列值设置为 null,如果我将 Point 列设置为 NOT NULL,则插入会给出“Column ‘点’不能为空”。 ST_PointFromWKB(?1,?2) 也会发生同样的情况,到底是什么?

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

但这并没有改变任何东西,我仍然从函数 ST_PointFromText('POINT (?1 ?2)')ST_PointFromWKB(?1,?2)。我确信我会通过这些论点。

<小时/>

最终更新:我能够解决这个问题,尽管我不知 Prop 体是如何解决的,而且我更不知道为什么它可以工作然后停止。但我所做的只是保留问题出现之前的代码,不使用 native 查询,确保我已在 pom.xml 中加载 lib hibernate-spatial,并设置配置 spring.jpa.properties。 hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect 在 application.yml 中,因为 spring.jpa.hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect 显然是不正确的。

最佳答案

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

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

听起来 git 是文本损坏的中心。

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

既然你暗示数据已经经过几手,我什至不能(从这里)冒险猜测它是什么时候被破坏的。

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

关于mysql - 尝试插入地理位置数据时出现 QueryException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53718167/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com