Пространственные запросы Postgis и Oracle с параметрами GeometryUserType

После настройки Postgis и Oracle пространственного для различных единиц сохраняемости Hibernate , у меня будут экземпляры MyClass, сохраняемые либо в базе данных Postgis, либо в базе данных Oracle, как настроено в моем persistence.xml и его файле сопоставления.

У меня будет аннотированный атрибут geom:

public abstract class MyClass (...)
@Type(type = "org.hibernatespatial.GeometryUserType")
  @Column(name = "geom", columnDefinition="Geometry", nullable = true)
protected Geometry geom; (...)

Настроен Persistence.xml:

<persistence-unit name="pers_unit_name" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>jta_data_source_name</jta-data-source>
    <mapping-file>oracle.hbm.xml</mapping-file>

И в моем oracle.hbm.xml:

<hibernate-mapping>
    <typedef name="org.hibernatespatial.GeometryUserType" class="org.hibernatespatial.GeometryUserType" >
        <param name="dialect">org.hibernatespatial.oracle.OracleSpatial10gDialect</param>
    </typedef>
</hibernate-mapping>

Конфигурация Postgis будет работать аналогичным образом.

Так что, когда я запрашиваю объекты MyClass, он выберет правильный диалект. Кажется, это работает, и я выбираю правильный диалект для этого атрибута, когда я вставляю или извлекаю информацию из базы данных (простой query.list()).

Но когда я фильтрую этот атрибут с помощью параметра этого типа:

String queryString = "SELECT NEW map(m.id, m.geom)" + 
     "FROM  MyClass m " + 
     "WHERE within (r.geom, :geometry) = true ";
final org.hibernate.Query query = session.createQuery(queryString);
query.setParameter("geometry", geom, GeometryUserType.TYPE);
return query.list();

Он будет использовать диалект Hibernate, настроенный по умолчанию для этого конкретного параметра, вместо указанного для единицы сохраняемости, поэтому он выведет трассировку стека ниже.

Можно ли каким-либо образом заставить использовать согласованный диалект, как я определил в блоке постоянства для этого конкретного поля параметра в предикате, вместо того, что настроено по умолчанию?

Caused by: java.sql.SQLException: Invalid column type
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:8921)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8396)
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9176)
    at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:9153)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:234)
    at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:188)
    at org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.setObject(DelegatingPreparedStatement.java:188)
    at org.hibernatespatial.AbstractDBGeometryType.nullSafeSet(AbstractDBGeometryType.java:154)
    at org.hibernatespatial.GeometryUserType.nullSafeSet(GeometryUserType.java:201)
    at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:146)
    at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:578)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1716)
    at org.hibernate.loader.Loader.doQuery(Loader.java:801)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.doList(Loader.java:2542)

person krause    schedule 23.07.2015    source источник