【问题标题】:hibernate-spatial: sql query to retrieve a geometryhibernate-spatial:用于检索几何的 sql 查询
【发布时间】:2013-01-04 08:20:20
【问题描述】:

我正在使用 postgresql、hibernate-spatial 和 postgis,并且希望能够使用 SqlQuery 来检索 Geometry 对象。

但是,每当我尝试查询点、多边形或几何图形时,例如

List list = session.createSQLQuery(
    "select geomfromewkt('SRID=1;POINT(1 1)')").list();

我得到了例外:

Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:78)
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:103)
    at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:328)
    at org.hibernate.loader.custom.CustomLoader$Metadata.getHibernateType(CustomLoader.java:590)
    at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.performDiscovery(CustomLoader.java:516)
    at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:532)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1962)
    at org.hibernate.loader.Loader.doQuery(Loader.java:802)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.doList(Loader.java:2533)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
    at org.hibernate.loader.Loader.list(Loader.java:2271)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)

hibernate.cfg.xml:

<property name="dialect">org.hibernatespatial.postgis.PostgisDialect</property>

这不是休眠空间产品的一部分还是我做错了什么?

谢谢,保罗。

相关库/版本:

  • hibernate-core-3.6.0.Final.jar
  • postgresql-9.0-801.jdbc4.jar
  • hibernate-spatial-postgis-1.1.1.jar
  • hibernate-spatial-1.1.1.jar
  • postgis-jdbc-1.3.3.jar
  • jts-1.12.jar

【问题讨论】:

  • 数据库是否在空间上启用并具有正确的权限?在客户端,尝试select * from geometry_columns
  • 是的,数据库一切正常。如果使用映射类和非本地 sql 类型查询(条件/hsql),我可以通过休眠检索几何。
  • 我确定我必须以某种方式将 'org.hibernatespatial.GeometryUserType' 应用于列...

标签: hibernate geometry postgis hibernate-spatial


【解决方案1】:

我想通了。我需要通过标量将“GeometryUserType”应用于列。

SQLQuery qry = session.createSQLQuery("select geomfromewkt('SRID=1;POINT(1 1)') as geom");
qry.addScalar("geom", GeometryUserType.TYPE);
List<Geometry> list = qry.list();

【讨论】:

  • 根据this answer,某些类型已被弃用,因此在 Hibernate 4+ 中被删除。我不得不在 Hibernate 4.1.4 中使用 org.hibernate.spatial.GeometryType.INSTANCE 而不是 GeometryUserType.TYPE
【解决方案2】:

我使用的是 Hibernate 5.1.0 Final,

dao.getSession().createSQLQuery("select buffer from puntosdeinteres where puntoid = 13193")
                        .addScalar("buffer", new GeolatteGeometryType(PGGeometryTypeDescriptor.INSTANCE))
                        .uniqueResult();

它确实有效,但现在我觉得那长篇大论不舒服。

【讨论】:

    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    相关资源
    最近更新 更多