直到以下版本的 hibernate-core
实现 'org.hibernate.orm:hibernate-core:6.6.0.Alpha1'
可以成功执行以下代码:
INSERT INTO example_table (geom)
VALUES (
ST_SetSRID(
ST_GeomFromGeoJSON(
$dollar${"type":"Point","coordinates":[-34.4214,-15.9216]}$dollar$
),
4326
)
)
ON CONFLICT DO NOTHING;
哪个休眠会运行以下语句:
INSERT INTO example_table (geom)
VALUES (
ST_SetSRID(
ST_GeomFromGeoJSON(
$dollar${"type":"Point","coordinates":[-34.4214,-15.9216]}$dollar$
),
4326
)
)
ON CONFLICT DO NOTHING;;
但是将该依赖关系升级为:
实现 'org.hibernate.orm:hibernate-core:6.6.0.CR1' 或以上,相同的查询将导致 hibernate 尝试执行以下语句:
INSERT INTO example_table (geom)
VALUES (
ST_SetSRID(
ST_GeomFromGeoJSON(
$dollar$""""""{type:Point,coordinates:[-34.4214,-15.9216]}$dollar$
),
4326
)
)
ON CONFLICT DO NOTHING;;
这会导致以下异常:[错误:未知的 GeoJSON 类型] [n/a]。
这些查询是使用 EntityManager.createNativeQuery(query) 运行的。
有谁知道为什么会发生这种情况(查询中存在多个双引号)?我在发行说明中找不到任何有关它的信息。我发现解决这个问题的唯一方法是去掉美元报价并用单引号包围 json,这不是我想要做的。
6.6.0.CR1 以上的每个版本都会发生这种情况,包括 spring boot 3.4.x 中 spring data jpa 使用的版本。
编辑。 1
我需要使用本机查询进行具有更新插入行为的批量插入。 Hibernate/JPA 不支持诸如 ON CONFLICT DO NOTHING 之类的操作。
由于空间扩展或配置更改的兼容性问题,插入 Hibernate EntityManager 和空间数据可能会在升级依赖版本后出现问题。检查您的方言或配置设置是否已更新,并且 Hibernate Spatial 是否包含在正确的版本中。