我正在尝试使用spring data jpa解析这个sql查询,以便在我的应用程序中使用。这是一个使用postgis地理空间功能的postgresql查询。这个查询基本上是试图找到表中给定经度和纬度的特定搜索半径内的所有记录。
SQL查询:
SELECT P.ID, P.PLACENAME, P.CATEGORY, P.SUBCATEGORY, A.GEOLOCATION, A.STREETNAME,
A.TOWN, A.STATE, A.COUNTRY, ST_Distance(A.geolocation::geography,
ST_GeomFromText('POINT(:lon :lat)', 4326)::geography, false)/1000.00 AS DISTANCE FROM
PLATFORM_VENDOR_COMMON P JOIN ADDRESS A ON P.ADDRESS_ID = A.ADDRESS_ID WHERE
ST_DWithin(A.geolocation::geography, ST_GeomFromText('POINT(:lon :lat)',
4326)::geography, ?, false) ORDER BY A.geolocation::geography <->
ST_GeomFromText('POINT(:lon :lat)', 4326)::geography OFFSET ? LIMIT 20
字符串
我尝试在JpaRepository接口下执行此查询,使用:
@Query(value = "SELECT P.ID, P.PLACENAME, P.CATEGORY, P.SUBCATEGORY, A.GEOLOCATION,
A.STREETNAME, A.TOWN, A.STATE, A.COUNTRY, ST_Distance(A.geolocation\\:\\:geography,
ST_GeomFromText('POINT(:lon :lat)', 4326)\\:\\:geography, false)/1000.00 AS DISTANCE
FROM PLATFORM_VENDOR_COMMON P JOIN ADDRESS A ON P.ADDRESS_ID = A.ADDRESS_ID WHERE
ST_DWithin(A.geolocation\\:\\:geography, ST_GeomFromText('POINT(:lon :lat)',
4326)\\:\\:geography, :radius, false) ORDER BY A.geolocation\\:\\:geography <->
ST_GeomFromText('POINT(:lon :lat)', 4326)\\:\\:geography OFFSET :pageNumber LIMIT
20", nativeQuery = true)
List<FindPvNearbyProjection> findAllNearby(@Param("lon") Double lon, @Param("lat")
Double lat,
@Param("radius") Integer radius, @Param("pageNumber") Integer pageNumber);
型
并期望命名查询在其对应的位置进行替换,但不知何故,spring jpa无法将此信息转换为sql语句,并给我这个错误:
[ERROR: parse error - invalid geometry\n Hint: \"POINT(:l\" <-- parse error at position 8 within geometry] [n/a]\n\tat org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:320)
型
我认为POINT
语句前的单引号(')是罪魁祸首,但我不确定。
我能做些什么来解决这个问题?
2条答案
按热度按时间e7arh2l61#
在PostgreSQL中连接字符串就像:
https://popsql.com/learn-sql/postgresql/how-to-concatenate-strings-in-postgresql
而不是使用:
第一个月
请试试这个:
ST_GeomFromText('POINT(' || :lon || ' ' || :lat || ')', 4326)
个nbysray52#
在使用原生查询时需要考虑一些事情,因为有时最小的事情也无法工作。
1.确保检查应用程序属性选择了正确的方言,以便Spring知道如何读取它。
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true spring.jpa.properties.hibernate.dialect= org.hibernate.dialect. PostgreSQL Dialect
1.创建直接Map到本地查询的实体。表名@Table(name =“Location”)应该与查询中的内容完全匹配。
1.在粘贴到@Query之前,确保所有命名参数都在DB编辑器中的方法和测试查询中
最后,基于关键字(JOIN,ORDER BY,ETC)将查询分隔在新的一行上,这有助于视觉拾取可能在本地查询中看到的问题。例如:
字符串