Java 数据库函数引号内的JDBI绑定值

Java 数据库函数引号内的JDBI绑定值,java,postgresql,postgis,jdbi,Java,Postgresql,Postgis,Jdbi,我尝试使用jdbi对PostGIS数据库进行空间查询,我尝试进行的查询是 @SqlQuery( "SELECT ST_asText( way ) " + "FROM planet_osm_roads " + "WHERE ST_DWithin( way, ST_GeomFromText( \'POINT( :lat :lng )\', ST_SRID( way ) ), :radius )" ) public List<Road> getRoadsNearPo

我尝试使用jdbi对PostGIS数据库进行空间查询,我尝试进行的查询是

@SqlQuery(
    "SELECT ST_asText( way ) " +
    "FROM planet_osm_roads " +
    "WHERE ST_DWithin( way, ST_GeomFromText( \'POINT( :lat :lng )\', ST_SRID( way ) ), :radius )" )
public List<Road> getRoadsNearPoint( @Bind("lat") double lat, @Bind("lng") double lng, @Bind("radius") int radius );
导致此异常

Exception in thread "main" org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: org.postgresql.util.PSQLException: ERROR: parse error - invalid geometry
  Hint: "POINT( :l" <-- parse error at position 9 within geometry [statement:"SELECT ST_asText( way ) FROM planet_osm_roads WHERE ST_DWithin( way, ST_GeomFromText( 'POINT( :lat :lng )', ST_SRID( way ) ), :radius )", located:"SELECT ST_asText( way ) FROM planet_osm_roads WHERE ST_DWithin( way, ST_GeomFromText( 'POINT( :lat :lng )', ST_SRID( way ) ), :radius )", rewritten:"SELECT ST_asText( way ) FROM planet_osm_roads WHERE ST_DWithin( way, ST_GeomFromText( 'POINT( :lat :lng )', ST_SRID( way ) ), ? )", arguments:{ positional:{}, named:{lng:-3997003.76,radius:10,lat:1.683948409E7}, finder:[]}]
    at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1334)
    at org.skife.jdbi.v2.Query.fold(Query.java:173)
    at org.skife.jdbi.v2.Query.list(Query.java:82)
    at org.skife.jdbi.v2.sqlobject.ResultReturnThing$IterableReturningThing.result(ResultReturnThing.java:255)
    at org.skife.jdbi.v2.sqlobject.ResultReturnThing.map(ResultReturnThing.java:48)
    at org.skife.jdbi.v2.sqlobject.QueryHandler.invoke(QueryHandler.java:45)
    at org.skife.jdbi.v2.sqlobject.SqlObject.invoke(SqlObject.java:175)
    at org.skife.jdbi.v2.sqlobject.SqlObject$1.intercept(SqlObject.java:75)
    at org.skife.jdbi.v2.sqlobject.CloseInternalDoNotUseThisClass$$EnhancerByCGLIB$$1c23157f.getRoadsNearPoint(<generated>)
    at com.elevations.Application.main(Application.java:36)
Caused by: org.postgresql.util.PSQLException: ERROR: parse error - invalid geometry
  Hint: "POINT( :l" <-- parse error at position 9 within geometry
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2182)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1911)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:173)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:465)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:458)
    at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1328)
    ... 9 more
线程“main”org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException:org.postgresql.util.PSQLException:错误:解析错误-无效几何体
提示:“POINT(:l”我想这是因为字符串中的参数替换。我们可以这样传递字符串

public abstract class RoadDao {
  @SqlQuery(
        "SELECT ST_asText( way ) " +
                "FROM planet_osm_roads " +
                "WHERE ST_DWithin( way, ST_GeomFromText( :point, ST_SRID( way ) ), :radius )" )
  public abstract List<Road> getRoadsNearPoint( @Bind("point") String point, @Bind("radius") int radius );

  public List<Road> getRoadsNearPoint( double lat, double lng, int radius ) {
    String point = "POINT(" + lat + lng + ")" ;
    return getRoadsNearPoint(point, radius);
  };
}
公共抽象类roadao{
@SqlQuery(
“选择ST_asText(路径)”+
“来自星球之路”+
“其中ST_DWithin(路径,ST_GeomFromText(:point,ST_SRID(路径)),:radius)”)
公共抽象列表getRoadsNearPoint(@Bind(“point”)字符串点,@Bind(“radius”)int-radius);
公共列表getRoadsNearPoint(双纬度、双液化天然气、整数半径){
字符串point=“点(“+lat+lng+”);
返回getRoadsNearPoint(点、半径);
};
}

我认为这是因为字符串中的参数替换。我们可以尝试这样传递字符串

public abstract class RoadDao {
  @SqlQuery(
        "SELECT ST_asText( way ) " +
                "FROM planet_osm_roads " +
                "WHERE ST_DWithin( way, ST_GeomFromText( :point, ST_SRID( way ) ), :radius )" )
  public abstract List<Road> getRoadsNearPoint( @Bind("point") String point, @Bind("radius") int radius );

  public List<Road> getRoadsNearPoint( double lat, double lng, int radius ) {
    String point = "POINT(" + lat + lng + ")" ;
    return getRoadsNearPoint(point, radius);
  };
}
公共抽象类roadao{
@SqlQuery(
“选择ST_asText(路径)”+
“来自星球之路”+
“其中ST_DWithin(路径,ST_GeomFromText(:point,ST_SRID(路径)),:radius)”)
公共抽象列表getRoadsNearPoint(@Bind(“point”)字符串点,@Bind(“radius”)int-radius);
公共列表getRoadsNearPoint(双纬度、双液化天然气、整数半径){
字符串point=“点(“+lat+lng+”);
返回getRoadsNearPoint(点、半径);
};
}

我确信为时已晚,但我还是设法让这一切顺利进行

道:

从资源:

GeostoreItem gs = geostoreDao.getGeostoreItem("POINT(" + points[0] + " " + points[1] + ")");

我确信现在已经太晚了,但我还是设法让这一切顺利进行

道:

从资源:

GeostoreItem gs = geostoreDao.getGeostoreItem("POINT(" + points[0] + " " + points[1] + ")");

您可以尝试删除转义字符()如“点(:lat:lng)”吗您可以尝试删除转义字符()如“点(:lat:lng)”吗