org.hibernate.MappingException:没有JDBC类型的Dialect映射:2002

时间:2010-06-15 10:14:12

标签: java oracle hibernate spatial

当我尝试使用JPA nativeQuery获取几何字段类型时,我得到org.hibernate.MappingException: No Dialect mapping for JDBC type: 2002

我正在使用Oracle和org.hibernatespatial.oracle.OracleSpatial10gDialect

几何字段映射为:

@Column(name="geometry")  
@Type(type = "org.hibernatespatial.GeometryUserType")  
private Geometry geometry;

// ...

List<Object> listFeatures = new LinkedList<Object>();

Query query = entityManager.createNativeQuery(
   "SELECT "+ slots +" , geometry FROM  edtem_features feature, edtem_dades dada WHERE" +
   " feature."+ tematic.getIdGeomField() +" = dada."+ tematic.getIdDataField()+ 
   " AND dada.capesid= "+ tematic.getCapa().getId() +
   " AND feature.geometriesid= "+ tematic.getGeometria().getId());
listFeatures.addAll(query.getResultList());

这是我在spring + struts2上的hibernate配置

<bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernatespatial.oracle.OracleSpatial10gDialect" />
            <property name="showSql" value="true" />
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernatespatial.oracle.OracleSpatial10gDialect</prop>
            <prop key="hibernate.default_schema">my_schema</prop>
        </props>
    </property>
</bean>

如何解决这个问题?或者如何强制几何类型使其工作?

5 个答案:

答案 0 :(得分:4)

您可以尝试使用以下映射定义:

@Column(name = "geometry", columnDefinition="Geometry", nullable = true) 
private Geometry geometry;

而不是:

@Column(name="geometry")  
@Type(type = "org.hibernatespatial.GeometryUserType")  
private Geometry geometry;

答案 1 :(得分:3)

问题不在您的查询或映射中,而是在您的Hibernate配置中。您会发现要为要使用的SQL方言的名称指定错误的字符串。建议你发布你正在使用的Hibernate配置文件。

答案 2 :(得分:0)

感谢您的回复,

我解决了使用namedQuery检索包含所有字段的整个对象及其类型几何。

非常感谢

答案 3 :(得分:0)

使用全文本搜索时收到相同的错误消息,这对我有帮助:

在PgAdmin中安装以下扩展名:unaccent; (对于Postgres用户-底部有一个示例)

类型:CREATE EXTENSION unaccent;,将创建/安装扩展名,并且该扩展名现在可供该数据库的用户使用。

请注意,它也应该安装在应用程序所在的服务器上。

接下来的步骤是什么

  • 创建自定义方言(以便识别和读取语法)
  • 在您的application.properties文件中添加该自定义方言。

以下是示例:

我将Spring Boot 2.0和Postgres用作数据库:

安装扩展程序后,我们创建以下类:本文中描述的PgFullTextFunctionPostgreSQL82Dialecthttp://www.welinux.cl/wordpress/implementing-postgresql-full-text-with-jpa-entities/

您也可以尝试以下方法: https://www.zymr.com/postgresql-full-text-searchfts-hibernate/

但是我正在使用第一个示例作为类,并且可以正常工作,我只是删除了 下一行:     value = org.apache.commons.lang3.StringUtils.stripAccents(value); 来自PgFullTextFunction类。

通常,据我了解,我们创建一个实现SQL函数接口的类,并以此方式创建新的方言。注册在类fts()中的PgFullTextDialect就像我们的PgFullTextFunction类中render方法的包装。

之后,在我们的application.properties文件中,将路径添加到新创建的方言中:

spring.jpa.properties.hibernate.dialect=com.your.package.name.persistence.PgFullTextDialect

如果您想对全文功能使用特定的配置,则可以查看我从上面的zymr.com发布的第二个链接,该示例中包含其他语言配置。

我希望这会有所帮助!

答案 4 :(得分:0)

您的查询:

Query query = entityManager.createNativeQuery("Query String");

您忘记添加实体类参数。

您应该添加实体类参数。

例如:

Query query = entityManager.createNativeQuery("Query String", EntityName.class);