【问题标题】:Hibernate Spatial - 'Invalid endian flag value encountered' ExceptionHibernate Spatial - “遇到无效的字节序标志值”异常
【发布时间】:2013-12-03 11:51:55
【问题描述】:

我正在尝试在 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);

我遇到了提到相同错误的this question on StackOverflow,但我声明我的coordinates 属性的方式与答案中提到的相同,但仍然出现此错误。

作为记录,我尝试使用 PostGIS 1.5.2 和 PostGIS 2.1.0。我还尝试了不同版本的 PostgreSQL JDBC 驱动程序,从 8.4 到 9.3。无论库版本如何,我仍然会遇到此问题。

任何人都可以阐明这里可能发生的事情吗?我的查询错了吗?我的财产定义不正确吗?还有什么我应该尝试的吗?我完全被困住了,对这里可能出现的问题不知所措。任何建议将不胜感激。

【问题讨论】:

  • within 函数在几个版本前已重命名为 ST_Within。此外,评估= true 是多余的,因为该函数返回一个布尔值。还有,你见过this answer?

标签: java hibernate postgresql postgis hibernate-spatial


【解决方案1】:

试试这个:

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

【讨论】:

  • 至于使用 HQL 查询来检索数据...祝你好运,这部分一直没有工作,最终通过 JPA 使用本机查询。
  • 您会注意到,正如我在问题中提到的,这几乎是我在实体上的确切注释。
  • 再仔细看看。你的:org.hibernate.spatial.GeometryType 我的:org.hibernatespatial.GeometryUserType
  • 有了你的,我在部署时遇到错误: 原因:java.lang.ClassNotFoundException: org.hibernatespatial.GeometryUserType 我在 hibernate-spatial-4.0.jar 库中看不到这个类。我相信我的注释是正确的。
【解决方案2】:

我通过添加以下依赖项解决了

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

代替我的旧依赖:com.vividsolutions

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-09
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多