1

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 );

これをしようとしている

    DBI dbi = new DBI( m_dataSource );
    RoadDAO dao = dbi.onDemand( RoadDAO.class );
    System.out.println( dao.getRoadsNearPoint( 16839484.09, -3997003.76, 10 ) );

この例外の結果

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

問題は引用符内の何かにバインドしようとしていると思われます。バインド値として「POINT( val val )」を使用して、それをいくつかの:pointにバインドしようとしましたが、それもうまくいきませんでした。これどうやってやるの?

4

2 に答える 2

0

文字列内のパラメータ置換が原因だと思います。このように文字列を渡してみることができます。

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);
  };
}
于 2015-09-15T18:12:43.030 に答える