相关疑难解决方法(0)

Hibernate Spatial - '遇到无效的endian标志值'异常

我正试图在PostgreSQL 9.3上的Hibernate Spatial 4.0中运行一个简单的查询.我在表中有许多具有纬度/经度值的对象,我正在尝试查询属于特定纬度/经度的给定半径范围内的对象.几何值似乎没有任何问题持久化,并在我的实体类中定义如下:

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

持久保存具有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)
Run Code Online (Sandbox Code Playgroud)

我正在运行的查询如下所示:

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

java postgresql hibernate postgis hibernate-spatial

7
推荐指数
1
解决办法
2020
查看次数

使用 Hibernate Spatial 查询 n 公里半径内的所有对象?

我使用休眠空间将地理位置附加到汽车上。我的卡域类如下所示:

import com.vividsolutions.jts.geom.Point
class Card {
  String name
  Point location 
}
Run Code Online (Sandbox Code Playgroud)

我的程序是用 Grails 编写的,所以我给出的示例是用 Groovy 编写的。我在这里找到了一篇类似的文章,它并没有真正回答关于如何正确指定半径以设置 n 公里的半径的最重要问题。

这是我计算圆几何形状的方法:

  private static Geometry createCircle(double x, double y, final double RADIUS) {
    GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
    shapeFactory.setNumPoints(1000);
    shapeFactory.setCentre(new Coordinate(x, y))
    shapeFactory.setSize( (RADIUS * 2)/88.1)

    return shapeFactory.createCircle().getBoundary()
  }
Run Code Online (Sandbox Code Playgroud)

圆的大小除以 88.1,这只是一个肮脏的修正来获得近似尺寸,但它仍然是错误的。

我的查询是这样完成的:

double radius = 40
Geometry filter = createCircle(car.location.x, car.location.y, radius)
Session session = sessionFactory.currentSession
Query q = session.createQuery("select c from Car c where within(c.location, ?) = true") …
Run Code Online (Sandbox Code Playgroud)

java hibernate jts geospatial hibernate-spatial

5
推荐指数
1
解决办法
4096
查看次数