Spring Boot 3.2中如何在H2数据库插入POINT类型经纬度数据?
在H2数据库中插入Geolatte经纬度数据的解决方案
针对你的Spring Boot 3.2 + Hibernate Geolatte + H2GIS环境,以下是适配H2的经纬度插入方案,同时解决data.sql在H2中运行报错的问题:
1. 调整插入SQL语句(两种可选方式)
方式一:直接使用H2GIS原生函数
H2GIS支持ST_POINT函数创建点数据,注意参数顺序是经度在前,纬度在后(和MySQL的POINT(lat lon)文本格式相反):
INSERT INTO test_check (location) VALUES (ST_POINT(174.5, -36.5, 4326));
方式二:兼容MySQL的函数别名(推荐)
如果不想维护两套SQL脚本,可以给H2创建MySQL函数的别名,让原有MySQL语句直接在H2中运行。
在application-dev.yml的数据源URL中添加初始化配置:
spring: datasource: url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;INIT=CREATE ALIAS IF NOT EXISTS ST_PointFromText FOR "org.h2gis.functions.spatial.convert.STPointFromText"; driver-class-name: org.h2.Driver username: sa password:
配置后,你原来的MySQL插入语句ST_PointFromText('POINT(-36.5 174.5)', 4326)就能在H2中正常执行。
2. 确保H2GIS扩展正确加载
H2本身不支持空间类型,必须加载H2GIS扩展才能使用几何函数。除了依赖配置外,还可以通过以下方式初始化:
方式一:通过SQL脚本初始化
创建src/main/resources/h2gis-init.sql脚本:
-- 加载H2GIS空间扩展 CREATE ALIAS IF NOT EXISTS H2GIS_SPATIAL FOR "org.h2gis.functions.factory.H2GISFunctions.load"; CALL H2GIS_SPATIAL(); -- 可选:添加MySQL函数别名,兼容原有SQL CREATE ALIAS IF NOT EXISTS ST_PointFromText FOR "org.h2gis.functions.spatial.convert.STPointFromText";
然后在application-dev.yml中配置数据源加载该脚本:
spring: datasource: url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'classpath:h2gis-init.sql'
方式二:代码初始化(可选)
如果偏好Java配置,可以在启动类中添加数据源初始化Bean:
@Bean public DataSourceInitializer dataSourceInitializer(DataSource dataSource) { DataSourceInitializer initializer = new DataSourceInitializer(); initializer.setDataSource(dataSource); ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); populator.addScript(new ClassPathResource("h2gis-init.sql")); initializer.setDatabasePopulator(populator); return initializer; }
3. 配置Hibernate空间方言
在开发环境中,需要指定Hibernate使用H2的空间方言,确保Geolatte类型正确映射:
spring: jpa: properties: hibernate: dialect: org.hibernate.spatial.dialect.h2geodb.GeoDBDialect
4. 验证数据
启动应用后,通过H2控制台执行查询语句验证数据是否正确插入:
SELECT id, ST_AsText(location) FROM test_check;
正常情况下会返回类似POINT(174.5 -36.5)的空间文本结果。
内容的提问来源于stack exchange,提问作者Al Grant
相关产品推荐
相关产品推荐

