分享

No Dialect mapping for JDBC type: 7

 hh3755 2011-04-29
http://topic.csdn.net/u/20090304/20/d466a78e-2b2c-4623-8973-c998dda5612a.html
没想到用SQLQUERY的时候可以有个简单的东西,就是
我看了错误信息有很多关于list的,网上帮你搜了一下,希望对你有所帮助。

createQuery与createSQLQuery两者区别是:  


前者用的hql语句进行查询,后者可以用sql语句查询  

前者以hibernate生成的Bean为对象装入list返回  

后者则是以对象数组进行存储  

所以使用createSQLQuery有时候也想以hibernate生成的Bean为对象装入list返回,就不是很方便  

突然发现createSQLQuery有这样一个方法可以直接转换对象  

Query query = session.createSQLQuery(sql).addEntity(XXX.class);  

XXX 代表以hibernate生成的Bean的对象,也就是数据表映射出的Bean。  

太牛了啊.我郁闷啊.

No Dialect mapping for JDBC type: 7 
I got this error while I was working with hibernate and SQL Server. Following are the findings I came across. Hope this helps you too rectify this error. 

Following questions are relevant to understand this clearly. 

What is jdbc type 7? 
java.sql.Type.REAL : It is a constant in the java programming language, that identifies SQL type REAL. 
Value of this constant is 7. This is the above mentioned jdbc type 7. 

What is dialect? 
Dialect is the type of the database that hibernate is going to use. Following are the commonly used dialects. These are the subclasses of the org.hibernate.dialect.Dialect for specific databases. 

org.hibernate.dialect.HSQLDialect 
org.hibernate.dialect.Oracle9Dialect 
org.hibernate.dialect.MySQLDialect 
org.hibernate.dialect.SQLServerDialect 
org.hibernate.dialect.FirebirdDialect 
What cause this error to occur? 
The database may contain a table with field of datatype real. Hibernate dialect SQLServerDialect doesnot understand this type. So we need to explicitly convert this real type to one that dialect can understand. One way to achieve this is to write a subclass of org.hibernate.dialect.SQLServerDialect. 


package co.nr.javaalert.hibernate.dialect; 
import java.sql.Types; 
public class SubSQLServerDialect extends org.hibernate.dialect.SQLServerDialect{ 
public SQLServerDialectForBilling() { 
super(); 
registerColumnType(Types.REAL,"number($p,$s)"); 
registerHibernateType(Types.REAL,"double"); 
} 
} 

registerColumnType() method register a type name for a given type code. This step register sql column data type NUMBER(precision,scale) to Types.REAL. Then register this Types.REAL with a data type that can understand hibernate. The recommended Java mapping for the sql REAL type is as a Java float. 

Use this subclass instead of org.hibernate.dialect.SQLServerDialect in hibernate.cfg.xml. 

Reference 
SQL dialects reference/Data structure definition/Data types/Numeric types 

Hibernate 数据库连接及SQLDialect 错误: No Dialect mapping for JDBC type

时间:2010-01-22 14:19 点击:1235次 字体:[  ]
Hibernate 不同数据库的连接及SQL方言

 

<!--MySql 驱动程序 eg. mysql-connector-java-5.0.4-bin.jar-->
  <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
  <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

  <!-- JDBC URL -->
  <property name="connection.url">jdbc:mysql://localhost/dbname?characterEncoding=gb2312</property>

  <!-- 数据库用户名-->
  <property name="connection.username">root</property>

  <!-- 数据库密码-->
  <property name="connection.password">root</property>
  
  
  <!--Sql Server 驱动程序 eg. jtds-1.2.jar-->
  <property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
  <property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>

  <!-- JDBC URL -->
  <property name="connection.url">jdbc:jtds:sqlserver://localhost:1433;DatabaseName=dbname</property>

  <!-- 数据库用户名-->
  <property name="connection.username">sa</property>

  <!-- 数据库密码-->
  <property name="connection.password"></property>

  
  
  <!--Oracle 驱动程序 ojdbc14.jar-->
  <property name="dialect">org.hibernate.dialect.OracleDialect</property>
  <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

  <!-- JDBC URL -->
  <property name="connection.url">jdbc:oracle:thin:@localhost:1521:dbname</property>

  <!-- 数据库用户名-->
  <property name="connection.username">test</property>

  <!-- 数据库密码-->
  <property name="connection.password">test</property>



如果出现如下错误,则可能是Hibernate SQL方言 (hibernate.dialect)设置不正确。
Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]'last_insert_id' 不是可以识别的 函数名。

RDBMS方言
DB2org.hibernate.dialect.DB2Dialect
DB2 AS/400org.hibernate.dialect.DB2400Dialect
DB2 OS390org.hibernate.dialect.DB2390Dialect
PostgreSQLorg.hibernate.dialect.PostgreSQLDialect
MySQLorg.hibernate.dialect.MySQLDialect
MySQL with InnoDBorg.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAMorg.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version)org.hibernate.dialect.OracleDialect
Oracle 9i/10gorg.hibernate.dialect.Oracle9Dialect
Sybaseorg.hibernate.dialect.SybaseDialect
Sybase Anywhereorg.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Serverorg.hibernate.dialect.SQLServerDialect
SAP DBorg.hibernate.dialect.SAPDBDialect
Informixorg.hibernate.dialect.InformixDialect
HypersonicSQLorg.hibernate.dialect.HSQLDialect
Ingresorg.hibernate.dialect.IngresDialect
Progressorg.hibernate.dialect.ProgressDialect
Mckoi SQLorg.hibernate.dialect.MckoiDialect
Interbaseorg.hibernate.dialect.InterbaseDialect
Pointbaseorg.hibernate.dialect.PointbaseDialect
FrontBaseorg.hibernate.dialect.FrontbaseDialect
Firebirdorg.hibernate.dialect.FirebirdDialect
以上是转载来的
///////////////////////////////////////////////////////////////////////////////////////////
有时候,hibernate用原生SQL 查询,native SQL 的时候,会出现
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1 ,-16,等等的错误
type 类型代码 可以看 java.sql.Types 中的定义,看源码就可以了

那是因为 Dialect  未定义,重写类,把未定义的Dialect 注册一下即可,
并且在 hibernate.cfg.xml中加入
Xml代码
  1. <property name="hibernate.dialect">  
  2.     org.hibernate.dialect.OracleCustomDialect   
  3. </property>  


Java代码
  1. import java.sql.Types;   
  2.   
  3. import org.hibernate.Hibernate;   
  4.   
  5. public class OracleCustomDialect extends org.hibernate.dialect.Oracle10gDialect {   
  6.   
  7.     public OracleCustomDialect() {   
  8.         super();   
  9.         registerHibernateType(Types.FLOAT, Hibernate.FLOAT.getName());   
  10.     }   
  11. }  
 
这是自己解决的折中办法,最好还是遵循标准类型
在hibernate中,Oracle9Dialect 方言定义有以下代码:
Java代码
  1. public class Oracle9Dialect extends Dialect {   
  2.   
  3.     private static final Logger log = LoggerFactory.getLogger( Oracle9Dialect.class );   
  4.   
  5.     public Oracle9Dialect() {   
  6.         super();   
  7.         log.warn( "The Oracle9Dialect dialect has been deprecated; use either Oracle9iDialect or Oracle10gDialect instead" );   
  8.         registerColumnType( Types.BIT, "number(1,0)" );   
  9.         registerColumnType( Types.BIGINT, "number(19,0)" );   
  10.         registerColumnType( Types.SMALLINT, "number(5,0)" );   
  11.         registerColumnType( Types.TINYINT, "number(3,0)" );   
  12.         registerColumnType( Types.INTEGER, "number(10,0)" );   
  13.         registerColumnType( Types.CHAR, "char(1 char)" );   
  14.         registerColumnType( Types.VARCHAR, 4000"varchar2($l char)" );   
  15.         registerColumnType( Types.VARCHAR, "long" );   
  16.         registerColumnType( Types.FLOAT, "float" );   
  17.         registerColumnType( Types.DOUBLE, "double precision" );   
  18.         registerColumnType( Types.DATE, "date" );   
  19.         registerColumnType( Types.TIME, "date" );   
  20.         registerColumnType( Types.TIMESTAMP, "timestamp" );   
  21.         registerColumnType( Types.VARBINARY, 2000"raw($l)" );   
  22.         registerColumnType( Types.VARBINARY, "long raw" );   
  23.         registerColumnType( Types.NUMERIC, "number($p,$s)" );   
  24.         registerColumnType( Types.DECIMAL, "number($p,$s)" );   
  25.         registerColumnType( Types.BLOB, "blob" );   
  26.         registerColumnType( Types.CLOB, "clob" );   
  27.   
  28. ……   
  29. ……  
 
而hibernate 3.3.2中 带的Oracle10gDialect方言代码如下,是继承了 Oracle9Dialect
Java代码
  1. public class Oracle10gDialect extends Oracle9iDialect {   
  2.   
  3.     public Oracle10gDialect() {   
  4.         super();   
  5.     }   
  6.   
  7.     public JoinFragment createOuterJoinFragment() {   
  8.         return new ANSIJoinFragment();   
  9.     }   
  10. }  
 
同时,在public abstract class Dialect 类中,定义了以下registerHibernateType, 所有的数据库类型的Dialect都是 extends Dialect
Java代码
  1. protected Dialect() {   
  2.     log.info( "Using dialect: " + this );   
  3.     sqlFunctions.putAll( STANDARD_AGGREGATE_FUNCTIONS );   
  4.   
  5.     // standard sql92 functions (can be overridden by subclasses)   
  6.     registerFunction( "substring"new SQLFunctionTemplate( Hibernate.STRING, "substring(?1, ?2, ?3)" ) );   
  7.     registerFunction( "locate"new SQLFunctionTemplate( Hibernate.INTEGER, "locate(?1, ?2, ?3)" ) );   
  8.     registerFunction( "trim"new SQLFunctionTemplate( Hibernate.STRING, "trim(?1 ?2 ?3 ?4)" ) );   
  9.     registerFunction( "length"new StandardSQLFunction( "length", Hibernate.INTEGER ) );   
  10.     registerFunction( "bit_length"new StandardSQLFunction( "bit_length", Hibernate.INTEGER ) );   
  11.     registerFunction( "coalesce"new StandardSQLFunction( "coalesce" ) );   
  12.     registerFunction( "nullif"new StandardSQLFunction( "nullif" ) );   
  13.     registerFunction( "abs"new StandardSQLFunction( "abs" ) );   
  14.     registerFunction( "mod"new StandardSQLFunction( "mod", Hibernate.INTEGER) );   
  15.     registerFunction( "sqrt"new StandardSQLFunction( "sqrt", Hibernate.DOUBLE) );   
  16.     registerFunction( "upper"new StandardSQLFunction("upper") );   
  17.     registerFunction( "lower"new StandardSQLFunction("lower") );   
  18.     registerFunction( "cast"new CastFunction() );   
  19.     registerFunction( "extract"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(?1 ?2 ?3)") );   
  20.   
  21.     //map second/minute/hour/day/month/year to ANSI extract(), override on subclasses   
  22.     registerFunction( "second"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(second from ?1)") );   
  23.     registerFunction( "minute"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(minute from ?1)") );   
  24.     registerFunction( "hour"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(hour from ?1)") );   
  25.     registerFunction( "day"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(day from ?1)") );   
  26.     registerFunction( "month"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(month from ?1)") );   
  27.     registerFunction( "year"new SQLFunctionTemplate(Hibernate.INTEGER, "extract(year from ?1)") );   
  28.   
  29.     registerFunction( "str"new SQLFunctionTemplate(Hibernate.STRING, "cast(?1 as char)") );   
  30.   
  31.        // register hibernate types for default use in scalar sqlquery type auto detection   
  32.     registerHibernateType( Types.BIGINT, Hibernate.BIG_INTEGER.getName() );   
  33.     registerHibernateType( Types.BINARY, Hibernate.BINARY.getName() );   
  34.     registerHibernateType( Types.BIT, Hibernate.BOOLEAN.getName() );   
  35.     registerHibernateType( Types.CHAR, Hibernate.CHARACTER.getName() );   
  36.     registerHibernateType( Types.DATE, Hibernate.DATE.getName() );   
  37.     registerHibernateType( Types.DOUBLE, Hibernate.DOUBLE.getName() );   
  38.     registerHibernateType( Types.FLOAT, Hibernate.FLOAT.getName() );   
  39.     registerHibernateType( Types.INTEGER, Hibernate.INTEGER.getName() );   
  40.     registerHibernateType( Types.SMALLINT, Hibernate.SHORT.getName() );   
  41.     registerHibernateType( Types.TINYINT, Hibernate.BYTE.getName() );   
  42.     registerHibernateType( Types.TIME, Hibernate.TIME.getName() );   
  43.     registerHibernateType( Types.TIMESTAMP, Hibernate.TIMESTAMP.getName() );   
  44.     registerHibernateType( Types.VARCHAR, Hibernate.STRING.getName() );   
  45.     registerHibernateType( Types.VARBINARY, Hibernate.BINARY.getName() );   
  46.     registerHibernateType( Types.NUMERIC, Hibernate.BIG_DECIMAL.getName() );   
  47.     registerHibernateType( Types.DECIMAL, Hibernate.BIG_DECIMAL.getName() );   
  48.     registerHibernateType( Types.BLOB, Hibernate.BLOB.getName() );   
  49.     registerHibernateType( Types.CLOB, Hibernate.CLOB.getName() );   
  50.     registerHibernateType( Types.REAL, Hibernate.FLOAT.getName() );  
 
如果有特殊类型确实需要,只能自定义。
所以oracle的类型定义最好遵循以上的 java.sql.Types
在hibernate.cfg.xml中使用 org.hibernate.dialect.OracleCustomDialect
以防出现No Dialect mapping for JDBC type错误
其他的 数据库类型,SQL SERVER  DB2 MYSQL 等等,都可以查看 hibernate的相关源码找出个所以然来

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多