【问题标题】:Postgis spatial function not working with hibernatePostgis空间功能不适用于休眠
【发布时间】:2020-09-30 01:36:01
【问题描述】:

我有一个 JpaRespository 的本地查询:

@Query(value = "SELECT * FROM Feature f WHERE f.feature_type = :featureType AND " +
            "ST_DWithin(geometry, 'SRID=:srid;POINT(:lon :lat 0)', :range)", nativeQuery = true)

生成的查询如下:

SELECT * FROM Feature f WHERE f.feature_type = ? AND ST_DWithin(geometry,'SRID=:srid;POINT(:lon :lat 0)', ?)

几何是表中包含空间数据的列。

但跟踪也表明查询存在解析错误:

Hint: "SR" <-- parse error at position 2 within geometry

但是当我在数据库中执行查询时,我得到了正确的结果。

为什么会出现这种不匹配?

我终于可以通过以下方式解决它:

@Query(value = "SELECT * FROM Feature f WHERE f.feature_type = :featureType AND " +
            "ST_DWithin(geometry, ST_GeographyFromText('SRID=' || :srid || ';POINT(' || :lon ||' ' || :lat || ' 0)'), :range)", nativeQuery = true)

【问题讨论】:

    标签: hibernate postgis


    【解决方案1】:

    您在字符串文字中绑定参数,这就是没有替换绑定参数的原因。

    'SRID=:srid;POINT(:lon :lat 0)'
    

    您可以使用此数据创建一个字符串,并在方法中传递整个字符串。

    另一种方法是使用数据库concat操作,但参数需要是字符串

    'SRID=' || :srid|| ';POINT(' || :lon ||' ' || :lat || ' 0)'
    

    像这样的完整查询

    @Query(value = "SELECT * FROM Feature f WHERE f.feature_type = :featureType AND " +
                "ST_DWithin(geometry, 'SRID=' || :srid || ';POINT(' || :lon ||' ' || :lat || ' 0)', :range)", nativeQuery = true)
    

    或者使用数据库函数

    ST_DWithin(geometry, ST_SetSRID(ST_Point( :lon, :lat), :srid), :range)
    

    【讨论】:

    • 这会抛出:原因:org.postgresql.util.PSQLException: 错误:函数 st_dwithin(geometry, text, double precision) is not unique 提示:无法选择最佳候选函数。您可能需要添加显式类型转换。
    • 传递字符串可能会有所帮助。
    • 检查函数定义可能是函数不是基于数据唯一的。那显然是你的传递数据问题
    • 奇怪。 Ffunction 有 2 个 diff 变体,具有不同数量的参数。postgis.net/docs/ST_DWithin.html
    • 这里st_dwithin函数的第一个参数是什么?
    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 2012-06-26
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多