gpt4 book ai didi

spring-boot - 具有 Geometry 返回类型的 Spring Data 存储库和 native 查询

转载 作者:行者123 更新时间:2023-12-05 02:15:10 27 4
gpt4 key购买 nike

我正在创建一个使用一些空间查询的项目。我使用带有 spring 数据存储库的 Spring boot 和带有 PostGIS 扩展的 PostgreSQL 作为数据库。

我创建了这个存储库:

import com.vividsolutions.jts.geom.Geometry;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface AreaRepository extends CrudRepository<Area, Long> {

/*
extra queries for Area here
*/

@Query(value="select st_intersection(" +
":base_layer ," +
":filter_layer" +
")", nativeQuery = true)
Geometry geometryIntersectGeometry(@Param("base_layer") Geometry baseGeometry,@Param("filter_layer") Geometry filterGeometry);

}

它包含对 Area 实体的一些查询。我还想使用一些 PostGIS 函数进行一些计算,所以我创建了 geometryIntersectGeometry 来从 PostGis 调用 st_intersection 函数,这应该返回一个几何图形。

我在设置中将休眠方言设置为 PostGIS:

spring.datasource.driverClassName=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://localhost:5432/test_db
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.jpa.properties.hibernate.dialect = org.hibernate.spatial.dialect.postgis.PostgisDialect

我有 hibernate spatial 的依赖项:

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-spatial</artifactId>
<version>${hibernate.version}</version>
</dependency>
...

调用 geometryIntersectGeometry 函数导致错误:

No Dialect mapping for JDBC type: 1111; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111,{}

如何告诉 JPA/Spring Data 将几何(PostGIS 类型)响应映射到 Geometry(com.vividsolutions.jts.geom.Geometry) 对象?

最佳答案

设法通过编写 custom implementation 来修复它存储库并注册类型(thx Simon Martinelli)

存储库:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface AreaRepository extends CrudRepository<Area, Long>, AreaGisRepository {

/*
extra queries for Area here
*/

}

界面:

import com.vividsolutions.jts.geom.Geometry;

public interface AreaGisRepository {

Geometry geometryIntersectGeometry(Geometry baseGeometry, Geometry filterGeometry);
}

和实现:

import com.vividsolutions.jts.geom.Geometry;
import org.hibernate.spatial.JTSGeometryType;
import org.hibernate.spatial.dialect.postgis.PGGeometryTypeDescriptor;
import org.springframework.beans.factory.annotation.Autowired;

import javax.persistence.EntityManager;

public class AreaGisRepositoryImpl implements AreaGisRepository {

private EntityManager entityManager;

@Autowired
public AreaGisRepositoryImpl(EntityManager entityManager) {
this.entityManager = entityManager;
}

@Override
public Geometry geometryIntersectGeometry(Geometry baseGeometry, Geometry filterGeometry) {
return (Geometry) entityManager
.createNativeQuery(
"select st_intersection(:base_layer , :filter_layer) as geom")
.setParameter("base_layer", baseGeometry)
.setParameter("filter_layer", filterGeometry)
.unwrap(org.hibernate.query.NativeQuery.class)
.addScalar("geom", new JTSGeometryType(PGGeometryTypeDescriptor.INSTANCE))
.getSingleResult();
}

}

它工作完美,但我现在对 Postgis 有一个硬编码依赖(我们不太可能使用其他东西,但是......)

关于spring-boot - 具有 Geometry 返回类型的 Spring Data 存储库和 native 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52330613/

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