2013-01-21 39 views
7

我使用postgresql,hibernate-spatial和postgis,期望能夠使用SqlQuery來檢索幾何對象。hibernate-spatial:用於檢索幾何的sql查詢

但是每當我試圖查詢點,多邊形或幾何形狀如

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-spatial產品的一部分,還是我做錯了什麼?

謝謝,保羅。

相關庫/版本:

  • 休眠核-3.6.0.Final.jar
  • 的PostgreSQL-9.0-801.jdbc4.jar
  • 休眠空間-PostGIS的-1.1.1的.jar
  • 休眠空間-1.1.1.jar
  • PostGIS的-JDBC-1.3.3.jar
  • JTS-1.12.jar
+0

數據庫是否空間啓用且具有正確的權限?從客戶端,嘗試'select * from geometry_columns' –

+0

是的,數據庫一切正常。如果使用映射類和非本機sql類型查詢(criteria/hsql),我可以通過hibernate檢索幾何。 – pstanton

+0

我確信我必須以某種方式將'org.hibernatespatial.GeometryUserType'應用於列... – pstanton

回答

6

我已經想通了。我需要通過標量將「GeometryUserType」應用於列。

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

根據[此答案](http://stackoverflow.com/a/10256646/1228324)某些類型已被棄用並因此在Hibernate 4+中被刪除。而不是'GeometryUserType.TYPE',我不得不在Hibernate 4.1.4中使用'org.hibernate.spatial.GeometryType.INSTANCE'。 – Michi

+1

任何人都試圖做類似於休眠5+? – pstanton

1

我使用Hibernate 5.1.0決賽,

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

和它的作品,但現在我發現,長期聲明不舒服。