8

PostgreSQL 9.3 の Hibernate Spatial 4.0 で単純なクエリを実行しようとしています。緯度/経度の値を持つテーブルに多数のオブジェクトがあり、特定の緯度/経度の特定の半径内にあるオブジェクトをクエリしようとしています。ジオメトリ値は問題なく永続化されているようで、私のエンティティ クラスでは次のように定義されています。

@Column(columnDefinition = "Geometry", nullable = true)
@Type(type = "org.hibernate.spatial.GeometryType")
private Point coordinates = null;

coordinates値が設定されたオブジェクトを永続化するときにエラーは発生しません。ただし、クエリを実行すると、次の例外が表示されます。

    javax.servlet.ServletException: javax.servlet.ServletException: javax.ejb.EJBTransactionRolledbackException: org.hibernate.exception.GenericJDBCException: could not extract ResultSet

    <snip />

org.postgresql.util.PSQLException: ERROR: Invalid endian flag value encountered.
    org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157)
    org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886)
    org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
    org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:555)
    org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:417)
    org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:302)
    org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:462)
    org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:56)
    org.hibernate.loader.Loader.getResultSet(Loader.java:2031)
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1832)
    org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1811)
    org.hibernate.loader.Loader.doQuery(Loader.java:899)
    org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:341)
    org.hibernate.loader.Loader.doList(Loader.java:2516)
    org.hibernate.loader.Loader.doList(Loader.java:2502)
    org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2332)
    org.hibernate.loader.Loader.list(Loader.java:2327)
    org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:490)
    org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
    org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:195)
    org.hibernate.internal.SessionImpl.list(SessionImpl.java:1268)
    org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
    org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:264)

私が実行しているクエリは次のようになります。

Query query = this.entityManager
        .createQuery(
                "SELECT v FROM MyEntity v WHERE within(v.coordinates, :filter) = true",
                MyEntity.class);
query.setParameter("filter", point);

同じエラーに言及しているStackOverflow でこの質問に遭遇coordinatesしましたが、回答に記載されているのと同じ方法でプロパティを宣言していますが、それでもこのエラーが発生します。

記録のために、PostGIS 1.5.2 と PostGIS 2.1.0 を使用してみました。また、8.4 から 9.3 までの異なるバージョンの PostgreSQL JDBC ドライバーも試しました。ライブラリのバージョンに関係なく、私はまだこの問題に遭遇しています。

ここで何が起こっているのか、誰にも光を当てることができますか? 私のクエリは間違っていますか?プロパティが正しく定義されていませんか? 他に試すべきことはありますか?私は完全に立ち往生しており、ここで何が問題なのか途方に暮れています。どんなアドバイスでも大歓迎です。

4

2 に答える 2

6

これを試して:

@Column(columnDefinition="Geometry")
@Type(type = "org.hibernatespatial.GeometryUserType")
private Point point;
于 2013-11-25T21:25:45.223 に答える