`

数据库中的字段和Java里面的类型匹配

 
阅读更多

当在hibernate中运用原始的sql语句进行操作的的时候,常常会报错,错误很多都是关于
No Dialect mapping for JDBC type:?这里的问号是不同的数字如:-1,1,-9,3等等,每种数字代表一种类型。经过分析和查找,问题常常发生在几个地方
1、错误的配置了hibernate的方言
2、就是你的数据库中的字段和Java里面的类型不匹配的问题 
错误如下:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
Error message:
org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
at org.hibernate.dialect.TypeNames.get(TypeNames.java:56)
at org.hibernate.dialect.TypeNames.get(TypeNames.java:81)
at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:370)
at org.hibernate.loader.custom.CustomLoader$Metadata.getHibernateType(CustomLoader.java:559)
at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.performDiscovery(CustomLoader.java:485)
at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:501)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1796)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2220)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
at org.hibernate.loader.Loader.list(Loader.java:2099)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
at com.tilsi.solr.dao.summary.EntryDAO.queryByEntryId(EntryDAO.java:164)
at com.tilsi.solr.service.db.DbSearchThread.searchSummary(DbSearchThread.java:69)
at com.tilsi.solr.service.db.DbSearchThread.call(DbSearchThread.java:48)
at com.tilsi.solr.service.db.DbSearchThread.call(DbSearchThread.java:1)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
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)

解决方法为:通过查询hibernate的源码,找到问题的根本所在,就是hibernate中不支持对应的数据类型,具体数据类型的值,请查看下表
查看 java.sql.Types 类,可以找到对应类型,调整相应的数据库里的类型,或者其他支持这个类型的方言。 
public final static int BIT   =  -7;
public final static int TINYINT  =  -6;
public final static int SMALLINT =   5;
public final static int INTEGER  =   4;
public final static int BIGINT   =  -5;
public final static int FLOAT   =   6;
public final static int REAL   =   7;
public final static int DOUBLE   =   8;
public final static int NUMERIC  =   2;
public final static int DECIMAL  =   3;
public final static int CHAR  =   1;
public final static int VARCHAR  =  12;
public final static int LONGVARCHAR  =  -1;
public final static int DATE   =  91;
public final static int TIME   =  92;
public final static int TIMESTAMP  =  93;
public final static int BINARY  =  -2;
public final static int VARBINARY  =  -3;
public final static int LONGVARBINARY  =  -4;
public final static int NULL  =   0;
public final static int OTHER  = 1111;
public final static int JAVA_OBJECT         = 2000;
public final static int DISTINCT            = 2001;
public final static int STRUCT              = 2002;
public final static int ARRAY               = 2003;
public final static int BLOB                = 2004;
public final static int CLOB                = 2005;
public final static int REF                 = 2006;
public final static int DATALINK = 70;
public final static int BOOLEAN = 16;
public final static int ROWID = -8;
public static final int NCHAR = -15;
public static final int NVARCHAR = -9;
public static final int LONGNVARCHAR = -16;
public static final int NCLOB = 2011;
public static final int SQLXML = 2009; 

这类错误,最后的问号表示不确定的数字,但是解决的方法都一样。
首先,自定义一个方言类——Hibernate Dialect,该类需要继承与我们使用的数据库相应的方言类。比如:如果我们用的是mysql(版本为5.x.x),我们需要继承“org.hibernate.dialect.MySQL5Dialect”;如果我们使用的是DB2,那么我们应该继承“org.hibernate.dialect.DB2Dialect”;我用的是SqlServer2008,所以我要继承“org.hibernate.dialect.SQLServerDialect”,参考代码如下:

    import java.sql.Types;   
      
    import org.hibernate.Hibernate;   
    import org.hibernate.dialect.SQLServerDialect;   
      
    public class SqlServer2008Dialect extends SQLServerDialect {   
      
        public SqlServer2008Dialect() {   
            super();   
            registerHibernateType(Types.CHAR, Hibernate.STRING.getName());   
            registerHibernateType(Types.NVARCHAR, Hibernate.STRING.getName());   
            registerHibernateType(Types.LONGNVARCHAR, Hibernate.STRING.getName());   
            registerHibernateType(Types.DECIMAL, Hibernate.DOUBLE.getName());   
        }   
    }  
总之大家可以在“org.hibernate.dialect”这个package中找到与数据库相对应的方言类。在其中,我们需要注意三点:

a、在默认构造方法中继承父类构造方法,同时调用“registerHibernateType(int code, String name)”方法将数据库中该数据类型映射到相应的java类型。code表示数据库中的数据类型整数表示,可以在“java.sql.Types”类中查到相应的数据库类型。name表示我们要映射的java类型。可以从“org.hibernate.Hibernate”中查到。

b、Types类。在Types中定义了数据库常用的字段类型,如:

    ……   
    public final static int LONGVARCHAR =  -1;   
    public final static int TIMESTAMP =  93;   
    ……  
也就是上面我列出的java.sql.Types。
我们可以根据“No Dialect mapping for JDBC type : ”后面紧跟的数字在该类(Types)中找到相应的类型。我们也可以根据数据表中字段的类型找到相应的值。这个值就是registerHibernateType(int code, String name)的第一个参数。

c、Hibernate类。Hibernate中定义了转换的目的类型,如第一段代码所示。能够转化成什么类型,可以在该类中查找。通过调用“getName()”方法得到一个String型。当然,如果你记住了,我们还可以这样写

    import org.hibernate.dialect.SQLServerDialect;   
      
    public class SqlServer2008Dialect extends SQLServerDialect {   
      
        public SqlServer2008Dialect() {   
            super();   
            registerHibernateType(1, "string");   
            registerHibernateType(-9, "string");   
            registerHibernateType(-16, "string");   
            registerHibernateType(3, "double");   
        }   
    }  
其实和上面是一样的,只是把上面所代表的值直接写出来了。需要注意的是super()方法的调用,不调用该方法是否会出现错误,这个我就不知道了,我没有测试,所以最好调一下。
然后,我们还需要在配置文件中作修改,我将连接数据库的方法放在了spring配置文件中了,这段代码就写在applicationContext.xml里面了:
<property name="hibernateProperties">
<props>
<!-- <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect </prop> -->
<prop key="hibernate.dialect">com.sense.workflow.util.SqlServer2008Dialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.cache.use_query_cache">false</prop> 
                <!-- 显示sql格式 -->
                <prop key="hibernate.format_sql">false</prop> 
</props>
</property>

最后还有一个解决方法:如果你的数据库表中某个字段不可以不用text类型的,将其改成其他类型(如:varchar等)也可以,这个方法虽然简单,当数据库字段必须用text类型的时候该方法就不行了。

分享到:
评论

相关推荐

    javasqlTypes数据库字段类型java数据类型的对应关系

    在Java编程语言中,与数据库交互是常见的任务,这就涉及到`java.sql.Types`枚举类,它是Java数据类型与数据库字段类型之间的桥梁。`java.sql.Types`定义了一系列常量,这些常量代表了SQL标准中的数据类型,使得我们...

    SQL的数据类型与Java数据类型的对应关系

    SQL的数据类型与Java数据类型的对应关系,是程序员必备的基础知识,欢迎大家下载。

    JAVA通过实体生成数据库表

    在实体类生成数据库表的过程中,反射被用来读取实体类的元数据,如字段名、类型等,然后根据这些信息构建出创建数据库表的SQL语句。 在实际应用中,我们可能使用Hibernate的`Hibernate Tools`或者MyBatis的`MyBatis...

    解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

    首先,需要了解Oracle数据库中char类型字段的特性。在Oracle中,char类型字段如果内容长度不够,会自动以空格方式补足长度。例如,字段namechar(5),若值为sgl,那么Oracle会自动用空格补足长度,最终值为sgl 。 ...

    JDOM实现从数据库读取字段生成XML树

    确保选择的字段类型与XML元素或属性类型相匹配。 3. **结果集处理**:执行SQL查询后,会得到一个`ResultSet`对象。遍历这个结果集,每行数据可以视为XML树的一个节点。例如,表的每一行可以转换为一个XML元素,而列...

    所有数据库存储过程in,out和java匹配对应字段

    oracle ,mysql ,db2,等多数据库 存储过程 out 和java 匹配的字段

    一个完整的数据库图片字段转化为本地图片的例子

    1. **BLOB数据类型**:学习如何在不同数据库系统(如MySQL、SQL Server、Oracle等)中创建和操作BLOB字段,了解其限制和性能影响。 2. **图片编码与解码**:图片在数据库中存储前,通常会被编码成常见的格式如JPEG...

    java连接mysql数据库实例框架

    在Java编程领域,连接MySQL数据库是一项基础且重要的任务,它涉及到Java数据库连接(JDBC)技术的使用。本文将深入探讨如何在Eclipse编辑器环境下,利用JDBC API实现一个简单的登录注册框架,以与MySQL数据库进行...

    Java中的输入汉字拼音首字母即自动显示数据库中相应内容

    在Java编程中,实现输入汉字拼音首字母自动显示出数据库中相应内容的功能,是常见的文本框自动补全(AutoComplete)技术的一种应用场景。这种技术通常用于提高用户输入的效率和准确性,常见于搜索引擎、输入法软件...

    JAVA串口助手接收数据并解析数据存入MySQL数据库中

    在使用Java程序前,需要预先在MySQL中创建数据库和数据表。例如,可以创建一个名为`sensor_data`的数据库,然后在其中创建一个名为`measurements`的数据表,包含`timestamp`、`value1`、`value2`等字段,用于存储...

    SuperMap Objects Java字段更新

    在GIS(地理信息系统)开发中,SuperMap Objects Java是一个强大的组件,它提供了丰富的地图操作和空间分析功能。本文将深入探讨如何使用SuperMap Objects Java来实现字段更新这一关键任务,特别是在实际项目中处理...

    Java数据类型与MySql数据类型对照表

    本文讲述了Java数据类型与MySql数据类型对照表。分享给大家供大家参考,具体如下: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.String 12 CHAR N CHAR java....

    将Excel文件导入到数据库中或将数据库中文件导出Excel中

    3. 设置导入参数:指定Excel文件路径,选择要导入的表或工作表,设置数据映射(字段对应关系),并处理可能出现的数据类型不匹配问题。 4. 执行导入:运行导入操作,数据库会根据设置将Excel数据转化为相应的记录...

    省市带拼音,邮政编码字段数据库

    标题中的“省市带拼音,邮政编码字段数据库”指的是一个包含中国各省市地区名称及其对应的拼音和邮政编码的数据集合。这个数据库通常用于各种信息化系统中,尤其是那些需要进行地理位置信息处理或者地址自动补全功能...

    java 连接数据库实现用户登录功能

    首先,我们需要了解Java中的JDBC(Java Database Connectivity),这是一个Java API,允许Java应用程序与各种类型的数据库进行通信。Oracle数据库是广泛使用的数据库管理系统,适用于大型企业级应用。为了连接到...

    Java实现Excel导入导出数据库的方法示例

    Java实现Excel导入导出数据库的方法示例主要讲解了如何将Excel文件导入到数据库中,并对Excel中的数据进行读取、写入和处理。该示例中,我们使用了Apache POI库来读取和写入Excel文件,并使用JDBC来连接数据库。

    java采集网页信息,并获取到所需要的信息存入数据库中对应的字段中去

    本篇文章将详细探讨如何使用Java进行网页信息采集,并将所需数据存储到数据库的相应字段中。 首先,我们需要了解网页采集的基本步骤: 1. **网络请求**:使用HTTP协议发送请求到目标网页,如使用`java.net.URL`和`...

    java实现excel导入数据库

    在Java编程中,将Excel数据导入到MySQL数据库是一项常见的任务,尤其在数据处理和分析的场景下。要完成这个过程,我们需要使用特定的库来读取...同时,确保数据库字段类型与Excel数据类型匹配,以防止数据转换错误。

    SQL2JAVA-java字段串代码拼接小工具

    标题中的“SQL2JAVA-java字段串代码拼接小工具”是指一个辅助开发的软件,它主要功能是帮助程序员便捷地在Java代码和SQL语句之间进行转换,特别是处理字符串拼接的问题。在软件开发过程中,尤其是在数据库交互时,...

Global site tag (gtag.js) - Google Analytics