`
kingquake21
  • 浏览: 268555 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用Hibernate原生SQL映射MYSQL的CHAR(n)类型到String时出错

    博客分类:
  • Java
阅读更多

数据库中有一个currencies表,表中有一个字段code,类型为CHAR(3),用于存放“CNY”,“USD”之类的字符串

与之对应的Java对象中的字段是String类型

 

如果通过Entity映射,没有问题,可以;

但是通过原生SQL和ResultTransformer映射时,却总是出错

String sql = "select currencies.code, attr1, attrN from currencies, table1,tableN";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setResultTransformer(       Transformers.aliasToBean(SomeClassName.class));

 跟踪到Hibernate内部,发现在做结果转换前,数据就不是想要的“CNY",而是”C“,类型也是Character,所以在做结果转换时出现了异常。

这个问题在Hibernate官网上有很多人提

https://hibernate.onjira.com/browse/HHH-2304

https://hibernate.onjira.com/browse/HBX-315

https://hibernate.onjira.com/browse/HHH-2220

 

总结了一下:

大致提到了两种解决办法,一个是利用数据库CAST函数,select cast( currencies.code as varchar),这个办法对于MYSQL无效,因为MYSQL的cast方法无法完成CHAR到VARCHAR的转换;

第二种办法就是继承MYSQL的dialect,在Hibernate中将CHAR(N)都注册为String类型

 

public class FixedMySQL5InnoDBDialect extends MySQL5InnoDBDialect{
	protected void registerVarcharTypes() {
        super.registerVarcharTypes();       
        registerColumnType(Types.CHAR, 255, "char($l)");
        registerHibernateType( Types.CHAR, Hibernate.STRING.getName() );
	}
}

 经过测试,第二种办法非常完美

另外:

如果只select一个属性的话,可以使用SQLQuery的addScalar("code",HIbernate.STRING);

但是多了的话,就需要将所有属性全部以这种方式告诉Hibernate如果映射

 

分享到:
评论

相关推荐

    hibernate执行原生sql语句

    Hibernate 提供了多种方式来执行原生 SQL 语句,其中之一是使用 `Session.createSQLQuery()` 方法,该方法返回一个 `SQLQuery` 对象,该对象提供了执行原生 SQL 语句的方法。 例如,我们可以使用以下代码来执行一个...

    hibernate 执行原生sql的几种方式

    在Java的持久化框架Hibernate中,执行原生SQL(Native SQL)是常见需求,尤其是在处理特定数据库特性或者优化性能时。本篇文章将详细介绍在Hibernate中执行原生SQL的几种方式,以及它们各自的适用场景和优缺点。 1....

    Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法

    然而,在使用Hibernate执行SQL查询时,如果查询的目标表中存在char类型的字段,Hibernate有时会将该字段的数据映射成一个字符,而非完整的字符串。这主要是由于Hibernate默认的映射机制所导致的,即对于char类型的...

    JAVA数据类型与Hibernate的类型映射

    对于数组和集合,如List、Set、Map等,Hibernate提供了ListType、SetType、MapType等映射类型,可以根据实际需求选择。 此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,...

    spring+hibernate,自己封装了原生sql的处理,模仿mybatis使用

    而Hibernate则是一个对象关系映射(ORM)框架,它简化了数据库操作,允许开发者通过Java对象来操作数据库,减少了对SQL的直接使用。 标题中的"spring+hibernate"表明这是一个将两者结合使用的项目。Spring和...

    Java数据类型,Hibernate数据类型,标准sql数据类型之间的对应表

    这里,我们提到了一个名为“Hibernate的映射类型_hibernate_mysql映射类型.doc”的文档,这很可能是一个详细的对照表,列出了Hibernate如何将Java数据类型映射到MySQL数据库的SQL数据类型。MySQL是世界上最流行的...

    Hibernate数据类型映射及ID

    4. **Yes/No**: 映射到`java.lang.Boolean`,在SQL中用`CHAR(1)`类型表示,使用`'Y'`或`'N'`作为值。 5. **True/False**: 映射到`java.lang.Boolean`,在SQL中用`CHAR(1)`类型表示,使用`'T'`或`'F'`作为值。 #### ...

    Hibernate之原生Native SQL查询

    然而,尽管Hibernate提供了强大的HQL(Hibernate Query Language)和Criteria API,但在处理某些特定的、复杂的SQL查询时,可能无法满足需求,这时就需要用到“原生的Native SQL查询”。 Native SQL查询允许我们...

    Hibernate中的查询:HQL、Criteria、原生SQl

    尽管HQL和Criteria API提供了面向对象的查询方式,但有时仍需使用原生SQL,尤其是在处理数据库特定的功能或性能优化时。Hibernate允许在需要时直接执行SQL查询,如下所示: ```java String sql = "SELECT * FROM ...

    Hibernate中Sql语句

    虽然HQL是Hibernate提供的面向对象的语言,能够方便地映射到Java对象,但在某些场景下使用原生SQL更加灵活高效,例如: - **复杂查询**:当需要执行复杂的数据库操作时,如分组、聚合、子查询等,原生SQL能更好地...

    sqlserver以及mysql hibernate xml映射语句

    本文主要介绍在使用Hibernate框架时,如何针对不同的数据库(如SQL Server和MySQL)进行配置,并实现XML映射语句的编写。 #### 二、Hibernate配置详解 ##### 2.1 MySQL配置 在Hibernate中,配置MySQL作为数据源...

    Hibernate 函数 ,子查询 和原生SQL查询

    在使用原生SQL时,需要注意的是,你需要自己处理结果的映射和事务管理,这可能比使用HQL(Hibernate查询语言)更加复杂。 总结,Hibernate提供了丰富的函数支持,使得我们在处理数据时更加便捷。同时,子查询功能...

    hibernate和MySQL的jar

    Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL语句。MySQL则是一款开源、免费的关系型数据库管理系统,广泛应用于Web应用程序。 在描述...

    使用hibernate对sqlserver 2005进行增删改查

    总的来说,使用Hibernate进行SQL Server 2005的CRUD操作涉及到配置文件的设定、实体类的创建、映射文件的编写以及DAO接口和实现。这个过程简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层的SQL。

    SpringBoot+hibernate+mysql+sqlserver双数据源

    Hibernate是一个强大的ORM(对象关系映射)框架,它允许开发者使用Java对象来操作数据库,无需关心底层SQL语句。在SpringBoot中,通过Spring Data JPA,我们可以方便地集成Hibernate,实现数据的CRUD(创建、读取、...

    Hibernate使用xdoclet生成映射文件和sql语句

    这篇博客文章“Hibernate使用xdoclet生成映射文件和sql语句”可能详细介绍了如何结合这两个工具进行开发。 在早期的Java开发中,XDoclet是基于Javadoc注解的工具,它可以解析Java类中的特定注解,并根据这些注解...

    Hibernate 映射类型与Java 类型对照

    理解Hibernate映射类型与Java类型的对应关系对于有效地使用Hibernate至关重要。 首先,我们来看一下基本数据类型的映射。`integer`对应Java中的`int`或`Integer`,在SQL中映射为`INTEGER`类型;`long`对应`long`或`...

    Hibernate SQLQuery执行原生SQL.docx

    在Java的Hibernate框架中,有时候我们需要执行自定义的SQL查询以获取特定的数据,这时就可以使用SQLQuery接口。本文将深入探讨Hibernate如何通过SQLQuery接口执行原生SQL查询,并展示如何处理查询结果。 一、创建...

    hibernate实现动态SQL查询

    在服务层,我们可以获取到参数,然后使用FREEMARKER解析模板文件生成具体的SQL语句。接下来,通过Hibernate的Session对象,执行这个动态生成的SQL,获取结果集。整个过程包括:加载模板文件、设置模型变量、解析模板...

    hibernate映射枚举类型

    Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了一种优雅的方式来映射枚举类型到数据库。本文将深入探讨Hibernate如何映射枚举类型,并给出实际应用示例。 ### Hibernate枚举映射方式 #### 1. `@...

Global site tag (gtag.js) - Google Analytics