2013-01-21 16 views
7

Sto utilizzando postgresql, hibernate-spatial e postgis e ci si aspetta che sia in grado di utilizzare un SqlQuery per recuperare un oggetto Geometry.hibernate-spatial: query sql per recuperare una geometria

Tuttavia ogni volta che provo ad interrogare un punto, Poligono o Geometria per esempio

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

ottengo l'eccezione:

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> 

Is questo non fa parte dell'offerta hibernate-spazial o sto facendo qualcosa di sbagliato?

Grazie, Paul.

pertinenti biblioteche/versioni:

  • sospensione-core-3.6.0.Final.jar
  • postgresql-9.0-801.jdbc4.jar
  • sospensione-spaziale-postgis-1.1.1 .jar
  • sospensione-spaziale-1.1.1.jar
  • postgis-jdbc-1.3.3.jar
  • jts-1.12.jar
+0

Il DB è abilitato spazialmente e dispone dei privilegi corretti? Dal client, prova 'seleziona * da geometry_columns' –

+0

Sì, il DB è tutto a posto. Posso recuperare le geometrie via ibernazione se utilizzo classi mappate e query di tipo non nativo-sql (criteri/hsql). – pstanton

+0

Sono sicuro di dover applicare "org.hibernatespatial.GeometryUserType" alla colonna in qualche modo ... – pstanton

risposta

6

L'ho capito. Devo applicare il "GeometryUserType" alla colonna tramite uno scalare.

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

Secondo [questa risposta] (http://stackoverflow.com/a/10256646/1228324) alcuni tipi sono stati deprecati e quindi rimosso in Hibernate 4+. Invece di 'GeometryUserType.TYPE' ho dovuto usare' org.hibernate.spatial.GeometryType.INSTANCE' in Hibernate 4.1.4. – Michi

+1

qualcuno ha provato a fare lo stesso in Hibernate 5+? – pstanton

1

Sto usando Hibernate 5.1.0 finale,

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

E funziona, ma in questo momento trovo che lunga dichiarazione a disagio.

Problemi correlati