Java JPA SQL Server 没有 JDBC 类型的方言映射:-9
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27039300/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JPA SQL Server No Dialect mapping for JDBC type: -9
提问by user1903224
Iam writing a native query like
我正在编写一个本机查询,如
Query query =
entityManagerUtil.getEntityManager().createNativeQuery("SELECT c.NodeID,c.Code,c.Name FROM COM_Location c");
query.getResultList();
but it is not working for me....
但它对我不起作用......
Iam using JPA , MSSQL Server 2008 with Spring.It is working fine when i try to write JPA queries with pojo classes but it is failing to execute native queries.
我正在使用 JPA、MSSQL Server 2008 和 Spring。当我尝试使用 pojo 类编写 JPA 查询但它无法执行本机查询时,它工作正常。
My configurations in persistance.xml
goes like this
我的配置persistance.xml
是这样的
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
Any one suggest me to fix the issuee
任何人建议我解决问题
My stack trace says...
我的堆栈跟踪说...
org.springframework.orm.jpa.JpaSystemException: org.hibernate.MappingException: No Dialect mapping for JDBC type: -9; nested exception is javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: -9
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:311)
at org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect.ajc$afterThrowing$org_springframework_orm_jpa_aspectj_JpaExceptionTranslatorAspecta1ac9(JpaExceptionTranslatorAspect.aj:15)
at com.iconma.carz.daoimpl.SecurityDaoImpl.getAllLocations(SecurityDaoImpl.java:40)
at com.iconma.carz.serviceimpl.SecurityServiceImpl.getAllLocations(SecurityServiceImpl.java:31)
at com.iconma.carz.controllers.SecurityController.getLocations(SecurityController.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:83)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: -9
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:255)
... 37 more
Caused by: org.hibernate.MappingException: No Dialect mapping for JDBC type: -9
at org.hibernate.dialect.TypeNames.get(TypeNames.java:77)
at org.hibernate.dialect.TypeNames.get(TypeNames.java:100)
at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:375)
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)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246)
... 37 more
回答by Mark Rotteveel
The type -9 is java.sql.Types.NVARCHAR
. Looking at the sources of the SQLServerDialect
variants on https://github.com/hibernate/hibernate-orm/tree/master/hibernate-core/src/main/java/org/hibernate/dialectthere is no mapping for nvarchar columns.
类型 -9 是java.sql.Types.NVARCHAR
. 查看https://github.com/hibernate/hibernate-orm/tree/master/hibernate-core/src/main/java/org/hibernate/dialect上的SQLServerDialect
变体来源,没有 nvarchar 列的映射。
You might want to try to define your own dialect that also registers various NVARCHAR
-like definitions:
您可能想尝试定义自己的方言,该方言也注册了各种NVARCHAR
类似定义:
public class SQLServer2008DialectWithNvarchar extends SQLServer2008Dialect {
public SQLServer2008DialectWithNvarchar () {
registerColumnType( Types.NCLOB, "nvarchar(MAX)" );
registerColumnType( Types.LONGNVARCHAR, "nvarchar(MAX)" );
registerColumnType( Types.NVARCHAR, "nvarchar(MAX)" );
registerColumnType( Types.NVARCHAR, 4000, "nvarchar()" );
}
}
I based this on the definition for VARCHAR
in the SQLServer2005Dialect
. You may need to put this class in the org.hibernate.dialect
package (or at least I seem to remember there are issues if you don't).
我此基础上定义VARCHAR
的SQLServer2005Dialect
。您可能需要将此类放在org.hibernate.dialect
包中(或者至少我似乎记得如果您不这样做会出现问题)。
NOTE: I haven't actually tested this!
注意:我还没有实际测试过这个!
回答by bharatpatel
I also face the same issue, So i do R&D and got solution as Do explicit cast like cast(t2.name as varchar), It works for me.
我也面临同样的问题,所以我进行了研发并得到了解决方案,比如像 cast(t2.name as varchar) 这样的显式转换,它对我有用。
cast(t2.name as varchar)
Check this url. http://www.coderanch.com/t/565413/ORM/databases/Dialect-mapping-JDBC-type
检查这个网址。 http://www.coderanch.com/t/565413/ORM/databases/Dialect-mapping-JDBC-type
回答by Vijay Kumar
I had a similar issue, my sql is this
我有一个类似的问题,我的 sql 是这样的
Query nmspQuery = em.createNativeQuery("select aster from MyTable where my_column = 1001")
The datatype for PRODUCT_NODE_ONIX_TYPE in the Oracle 11g is nvarachar2
Oracle 11g 中 PRODUCT_NODE_ONIX_TYPE 的数据类型是 nvarachar2
I fixed it by casting the value astr to to_char. This worked fine
我通过将值 astr 转换为 to_char 来修复它。这工作得很好
Query nmspQuery = em.createNativeQuery("select TO_CHAR(aster) from MyTable where my_column = 1001")
回答by slobo
You have to extend the dialect, and register the appropriate Hibernate types for the N* JDBC types, in the constructor:
您必须扩展方言,并在构造函数中为 N* JDBC 类型注册适当的 Hibernate 类型:
public class MyDialect extends SomeOfTheProvidedDialects {
public MyDialect() {
registerHibernateType(Types.NCHAR, StandardBasicTypes.CHARACTER.getName());
registerHibernateType(Types.NCHAR, 1, StandardBasicTypes.CHARACTER.getName());
registerHibernateType(Types.NCHAR, 255, StandardBasicTypes.STRING.getName());
registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());
registerHibernateType(Types.LONGNVARCHAR, StandardBasicTypes.TEXT.getName());
registerHibernateType(Types.NCLOB, StandardBasicTypes.CLOB.getName());
}
}
Tested, works fine.
经测试,工作正常。
They should have added these to the Hibernate source code already (in the org.hibernate.dialect.Dialect class)...
他们应该已经将这些添加到 Hibernate 源代码中(在 org.hibernate.dialect.Dialect 类中)...
回答by Ebrahim Amini Sharifi
First you have to define what is your dialect class name that you want to use: in hibernate.cfg.xml add your own class address
首先,您必须定义要使用的方言类名称:在 hibernate.cfg.xml 中添加您自己的类地址
<property name="hibernate.dialect">com.nhl.dao.SQlServerDBDialect</property>
then create new class same below
然后创建与下面相同的新类
package com.nhl.dao;
import java.sql.Types;
import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.type.StandardBasicTypes;
public class SQlServerDBDialect extends SQLServerDialect {
public SQlServerDBDialect() {
super();
registerHibernateType(Types.NCHAR, StandardBasicTypes.CHARACTER.getName());
registerHibernateType(Types.NCHAR, 1, StandardBasicTypes.CHARACTER.getName());
registerHibernateType(Types.NCHAR, 255, StandardBasicTypes.STRING.getName());
registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());
registerHibernateType(Types.LONGNVARCHAR, StandardBasicTypes.TEXT.getName());
registerHibernateType(Types.NCLOB, StandardBasicTypes.CLOB.getName());
}
}