6

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

我正在使用 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 上的休眠配置

<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>

如何解决?或者如何强制几何的类型使其工作?

4

5 回答 5

4

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

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

代替:

@Column(name="geometry")  
@Type(type = "org.hibernatespatial.GeometryUserType")  
private Geometry geometry;
于 2010-06-15T16:38:15.777 回答
3

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

于 2010-06-15T10:18:36.137 回答
0

感谢您的回复,

我使用 namedQuery 解决了使用他的类型几何检索具有所有字段的整个对象。

非常感谢

于 2010-06-18T09:51:02.897 回答
0

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

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

类型:CREATE EXTENSION unaccent;然后扩展程序被创建/安装,现在可供该数据库的用户使用。

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

下一步是什么:

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

示例如下:

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

安装扩展后,我们创建以下类:PgFullTextFunctionPostgreSQL82Dialect在文章中描述: http ://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中 render 方法的包装器。PgFullTextFunction

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

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

如果您想为您的全文功能使用特定配置,您可以查看我在上面 zymr.com 发布的第二个链接,该示例带有附加语言配置。

我希望这会有所帮助!

于 2019-10-17T04:42:22.177 回答
0

您的查询:

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

您忘记添加实体类参数。

您应该添加实体类参数。

例如:

Query query = entityManager.createNativeQuery("Query String", EntityName.class);
于 2020-05-07T13:02:25.993 回答