当我尝试使用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>
如何解决这个问题?或者如何强制几何类型使其工作?
答案 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;
,将创建/安装扩展名,并且该扩展名现在可供该数据库的用户使用。
请注意,它也应该安装在应用程序所在的服务器上。
接下来的步骤是什么
以下是示例:
我将Spring Boot 2.0和Postgres用作数据库:
安装扩展程序后,我们创建以下类:本文中描述的PgFullTextFunction
和PostgreSQL82Dialect
:
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
就像我们的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);