数据库中有一个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 语句,其中之一是使用 `Session.createSQLQuery()` 方法,该方法返回一个 `SQLQuery` 对象,该对象提供了执行原生 SQL 语句的方法。 例如,我们可以使用以下代码来执行一个...
在Java的持久化框架Hibernate中,执行原生SQL(Native SQL)是常见需求,尤其是在处理特定数据库特性或者优化性能时。本篇文章将详细介绍在Hibernate中执行原生SQL的几种方式,以及它们各自的适用场景和优缺点。 1....
然而,在使用Hibernate执行SQL查询时,如果查询的目标表中存在char类型的字段,Hibernate有时会将该字段的数据映射成一个字符,而非完整的字符串。这主要是由于Hibernate默认的映射机制所导致的,即对于char类型的...
对于数组和集合,如List、Set、Map等,Hibernate提供了ListType、SetType、MapType等映射类型,可以根据实际需求选择。 此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,...
而Hibernate则是一个对象关系映射(ORM)框架,它简化了数据库操作,允许开发者通过Java对象来操作数据库,减少了对SQL的直接使用。 标题中的"spring+hibernate"表明这是一个将两者结合使用的项目。Spring和...
这里,我们提到了一个名为“Hibernate的映射类型_hibernate_mysql映射类型.doc”的文档,这很可能是一个详细的对照表,列出了Hibernate如何将Java数据类型映射到MySQL数据库的SQL数据类型。MySQL是世界上最流行的...
4. **Yes/No**: 映射到`java.lang.Boolean`,在SQL中用`CHAR(1)`类型表示,使用`'Y'`或`'N'`作为值。 5. **True/False**: 映射到`java.lang.Boolean`,在SQL中用`CHAR(1)`类型表示,使用`'T'`或`'F'`作为值。 #### ...
然而,尽管Hibernate提供了强大的HQL(Hibernate Query Language)和Criteria API,但在处理某些特定的、复杂的SQL查询时,可能无法满足需求,这时就需要用到“原生的Native SQL查询”。 Native SQL查询允许我们...
尽管HQL和Criteria API提供了面向对象的查询方式,但有时仍需使用原生SQL,尤其是在处理数据库特定的功能或性能优化时。Hibernate允许在需要时直接执行SQL查询,如下所示: ```java String sql = "SELECT * FROM ...
虽然HQL是Hibernate提供的面向对象的语言,能够方便地映射到Java对象,但在某些场景下使用原生SQL更加灵活高效,例如: - **复杂查询**:当需要执行复杂的数据库操作时,如分组、聚合、子查询等,原生SQL能更好地...
本文主要介绍在使用Hibernate框架时,如何针对不同的数据库(如SQL Server和MySQL)进行配置,并实现XML映射语句的编写。 #### 二、Hibernate配置详解 ##### 2.1 MySQL配置 在Hibernate中,配置MySQL作为数据源...
在使用原生SQL时,需要注意的是,你需要自己处理结果的映射和事务管理,这可能比使用HQL(Hibernate查询语言)更加复杂。 总结,Hibernate提供了丰富的函数支持,使得我们在处理数据时更加便捷。同时,子查询功能...
Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL语句。MySQL则是一款开源、免费的关系型数据库管理系统,广泛应用于Web应用程序。 在描述...
总的来说,使用Hibernate进行SQL Server 2005的CRUD操作涉及到配置文件的设定、实体类的创建、映射文件的编写以及DAO接口和实现。这个过程简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是底层的SQL。
Hibernate是一个强大的ORM(对象关系映射)框架,它允许开发者使用Java对象来操作数据库,无需关心底层SQL语句。在SpringBoot中,通过Spring Data JPA,我们可以方便地集成Hibernate,实现数据的CRUD(创建、读取、...
这篇博客文章“Hibernate使用xdoclet生成映射文件和sql语句”可能详细介绍了如何结合这两个工具进行开发。 在早期的Java开发中,XDoclet是基于Javadoc注解的工具,它可以解析Java类中的特定注解,并根据这些注解...
理解Hibernate映射类型与Java类型的对应关系对于有效地使用Hibernate至关重要。 首先,我们来看一下基本数据类型的映射。`integer`对应Java中的`int`或`Integer`,在SQL中映射为`INTEGER`类型;`long`对应`long`或`...
在Java的Hibernate框架中,有时候我们需要执行自定义的SQL查询以获取特定的数据,这时就可以使用SQLQuery接口。本文将深入探讨Hibernate如何通过SQLQuery接口执行原生SQL查询,并展示如何处理查询结果。 一、创建...
在服务层,我们可以获取到参数,然后使用FREEMARKER解析模板文件生成具体的SQL语句。接下来,通过Hibernate的Session对象,执行这个动态生成的SQL,获取结果集。整个过程包括:加载模板文件、设置模型变量、解析模板...
Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了一种优雅的方式来映射枚举类型到数据库。本文将深入探讨Hibernate如何映射枚举类型,并给出实际应用示例。 ### Hibernate枚举映射方式 #### 1. `@...