Hibernate Spatial - 'Invalid endian flag value encountered' 异常

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。我还尝试过不同版本的PostgreSQL JDBC驱动程序,从8.4到9.3都试过了。无论使用哪个库版本,我仍然遇到了这个问题。

有人能解释一下这里可能发生了什么吗?我的查询有问题吗?我的属性定义不正确吗?我应该尝试其他什么方法吗?我完全陷入困境,不知道问题出在哪里。非常感谢任何建议。


within函数在几个版本前被改名为ST_Within。此外,评估= true是多余的,因为该函数返回一个布尔值。你看过这个答案吗? - Mike T
2个回答

6

试试这个:

@Column(columnDefinition="Geometry")
@Type(type = "org.hibernatespatial.GeometryUserType")
private Point point;

就使用HQL查询检索数据而言……祝你好运,我从来没有使那部分工作正常,最终使用了通过JPA的本地查询。 - SergeyB
你会注意到这几乎是我在实体上提到的完全相同的注释,就像我在问题中提到的那样。 - Shadowman
再仔细看一点。你的:org.hibernate.spatial.GeometryType 我的:org.hibernatespatial.GeometryUserType - SergeyB
1
使用您的代码进行部署时出现错误:Caused by: java.lang.ClassNotFoundException: org.hibernatespatial.GeometryUserType我在hibernate-spatial-4.0.jar库中没有找到这个类。我相信我的注释是正确的。 - Shadowman

1

我通过添加以下依赖项解决了这个问题

<dependency>
    <groupId>org.locationtech.jts</groupId>
    <artifactId>jts-core</artifactId>
    <version>1.16.1</version>
</dependency>

用我的旧依赖: com.vividsolutions 的位置,改为:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接