尝试在包含地理位置数据的表中插入条目时遇到麻烦。实际上,该表仅包含一个地理位置列,即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',
此 我正在使用以下方法保存数据: 下面是我的application.yml,其配置与代码停止工作之前相同。 现在,我找到了答案,说明将 感谢您的帮助, 谢谢 更新:进一步研究,我发现所有表都是为MyISAM创建的,而不是为InnoDB创建的,并且显然休眠状态未检测到application.yml中的配置。春天的日志说: 找不到hibernate.properties 使用方言:org.hibernate.dialect.MySQL5Dialect 顺便说一句,我能够使用下面的命令直接在mysql控制台中插入: 但是,当尝试使用本机查询从Java使用该查询时,仍然没有游戏。插入现在可以正常工作,但是函数 更新2:按照以下提示,我可以强制使用方言MySQL5InnoDBDialect:https://stackoverflow.com/a/44472411/3435735。 但这并没有任何改变,我仍然从函数 最终更新:尽管我不知道具体如何,但我能够解决此问题,而且我什至不知道为什么它起作用然后又停止。但是我所做的只是保留了问题出现之前的代码,没有使用本机查询,请确保我已在pom.xml中加载了lib hibernate-spatial,并在application.yml中设置了配置public Location addLocation(Location location){
location.setPoint(new Point(location.getCoordX(),location.getCoordY()));
return locationRepository.saveAndFlush(location);
}
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配置,因为以前使用过相同的配置。
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)'));
ST_PointFromText('POINT (?1 ?2)')
始终将列值设置为null,如果将Point列设置为NOT NULL,则插入将给出“ Column'point'不能为null”。 ST_PointFromWKB(?1,?2)
会发生同样的事情吗?ST_PointFromText('POINT (?1 ?2)')
和ST_PointFromWKB(?1,?2)
中得到null。而且我肯定会传递参数。
spring.jpa.properties.hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect
,因为spring.jpa.hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect
显然是错误的。
答案 0 :(得分:0)
This <bytearray:�� should be the value of the Point field.
POINT
是二进制类型。您不能使用字符;您必须使用一些十六进制或某种转义机制。
听起来git
是文字修饰的中心。
每个人和他的小弟弟都想用不是简单的Ascii字节做有趣的事情。带问号的黑色菱形是“替换”字符-当有人期望UTF-8获得的编码不是UTF-8时,它就会显示出来。原始数据丢失。
由于您已经暗示数据已通过多只手传递,所以我(从这里)甚至无法冒险猜测数据何时被篡改。
请特别注意,Point
是“二进制”编码(也称为“字节数组”),因此需要采取一些措施来防止其被破坏。有些使用十六进制,有些使用Base64。显然,某个步骤无法执行此操作,因此让后续步骤可以举起其UTF-8手并生成那些字符。