文档章节

Hibernate createSQLQuery 查询char类型结果为一个字符解决方法汇总

Lofo
 Lofo
发布于 2014/11/14 16:18
字数 895
阅读 419
收藏 4
点赞 0
评论 0
在使用Hibernate的原生态SQL对Oracle进行查询时,碰到查询char类型的时候始终返回的是一个字符,开始认为应该是Hibernate在做映射的把数据类型给映射成char(1),在经过查找网上的一些资料,得知产生这个问题的主要原因确实是Hibernate再查询Oracle的时候,将char自动映射成character(varchar的子集)类型,oracle的char字段在hibernate里映射为character类型,是varchar的子集。 现有以下几种解决方法: 

1:将你要查询的实体转换成实体Bean 

使用HQL查询,每个表都有映射文件配置,反向工程生成的映射文件里对于多字符的char会自动映射到java中的string类型。这样就不存在字段映射的问题了,但是这样不能使用SQL; 


2:可以使用Hibernate中的addScalar(String arg,Type type)来自定义返回字段的类型 ,如: 


this.getSession().createSQLQuery("select id,name,state from tb") 
.addScalar("id", Hibernate.STRING)
.addScalar("name", Hibernate.STRING)

.addScalar("state", Hibernate.STRING
).list();


这样就可以解决,但是这样的话,必须把所有要查询的字段进行定义,在字段比较多的时候,就相对比较麻烦; 

3:在Oracle查询语句中直接指定数据格式 ,如: 


select id,name,cast(state as varchar(2)) from tb 

这种解决方法比较方便,只需要在查询语句指定char的返回类型,推荐使用这种方法进行查询。

4、修改hibernate默认的char映射类型

通过重写继承其方言类实现。自定义Hibernate Dialect.我用的数据库是ORACLE,:

首先建一个类,继承com.digitwater.fwk.hibernate.Oracle9iDialect,该类的内容如下:

public class MySQLDialect extends MySQL5Dialect {
	public MySQLDialect() {
		super();
		registerHibernateType(Types.CHAR, Hibernate.STRING.getName()); 
	}
	
}

第二步,就是修改hibernate的配置文件hibernate.cfg.xml:

将:<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>

改为:<prop key="hibernate.dialect">com.fy.mgr.support.MySQLDialect</prop>


此方法改动是最小的。目前使用正常,暂时没发现其它问题。

5、 Hibernate中将SQL查询出来字段转换为对象的方法有两种

1.使用ResultTransformer,代码如下
query.setResultTransformer(new AliasToBeanResultTransformer(StudentDTO.class)).list()

这种方法要求数据库的字段名和类的属性的大小写必须一致,但是Oracle查询返回的字段名却全是大写。 

2.使用addEntity方法,这种方法的缺点是SQL必须写成select * from users的形式或select {a.*},{b.*} from a,b where...的格式

附:oracle cast()函数用法:

cast 是进行类型转换的, 可以针对各种Oracle数据类型. 修改的是用户的数据类型.

round只是修改的数据显示格式. 对数据做四舍五入. 类似的函数还有ceil(取此数据的最小整数). trunc( 取整函数.)

SQL> create table t1(a varchar(10));

Table created.

SQL> insert into t1 values ('12.3456');

1 row created.

SQL> select round(a) from t1;

ROUND(A)
----------
12

SQL> select round(a,3) from t1;

ROUND(A,3)
----------
12.346

SQL> select cast(a as int) from t1;

CAST(AASINT)
------------
12

SQL> select cast(a as number(8,4)) from t1;

CAST(AASNUMBER(8,4))
--------------------
12.3456

© 著作权归作者所有

共有 人打赏支持
Lofo
粉丝 13
博文 64
码字总数 17024
作品 0
长宁
高级程序员
hibernate里createSQLQuery的addEntity()和setResultTran

使用SQLQuery 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。最简单的情况下,我们可以采用以下形式: List cats = sess.createSQLQuer...

Zero零_度
2015/05/19
0
0
Hibernate原生SQL查询

Hibernate除了支持HQL查询外,还支持原生SQL查询。 一、标量查询 它们都将返回一个Object数组组成的List,数组每个元素都是person_inf表的一个字段值。Hibernate会使用ResultSetMetadata来判...

ForingY
2016/12/29
5
0
Hibernate通过SQL查询常量时只能返回第一个字符的解决方法

在Hibernate中如果通过 session.createSQLQuery("select '合计' as name from dual").list() 查询,返回值中只会有一个“合”字。 经查,常量在数据库中被认为是CHAR类型的,Hibernate取值时...

java-苦苦甜甜
2013/06/04
0
0
mysql数据库中text类型的数据一直提示Data too long 的问题

描述下场景:是用一个hibernate的createSQLQuery()方法,调用一个存储过程,存储其中一个json字符串的时候报出了以下异常: org.hibernate.exception.DataException: Data truncation: Data...

夜半
2016/08/24
641
3
Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法

在使用Hibernate的原生态SQL对Oracle进行查询时,碰到查询char类型的时候始终返回的是一个字符,开始认为应该是Hibernate在做映射的把数据类型给映射成char(1),在经过查找网上的一些资料,得...

lovedreamland
2011/07/01
0
0
解决Hibernate原生SQL映射问题

在问答里和论坛中,经常看到有人问,怎样将使用本地SQL查询出来的结果映射为值对象的问题,这里就Hibernate中提供的方法做个结论。前提,这里没有使用属性的延迟加载技术。 假设有个值对像,...

-wangming-
2015/05/23
0
0
Hibernate SQL查询 addScalar()或addEntity()

Hibernate除了支持HQL查询外,还支持原生SQL查询。 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。该接口是Query接口的子接口。 执行S...

小和尚敲代码
2016/01/29
66
0
Hibernate3查询返回Map探秘

-源于我对它的一个误会 sparta-紫杉 2010-4-14 9:02 开发环境: eclipse3.4.2 + weblogic10.3 + jdk1.6.0_13 + Struts2.1.8 + Spring3.0.1 + Hiberante3.3.2 初识Hibernate3的查询结果返回M......

吕兵阳
2014/07/10
0
0
hibernate执行sql获取泛型对象

看下面的SQL查询示例: private void test() { //获取Hibernate Session对象 Session session = HibernateUtil.currentSession(); //开始事务 Transaction tx = session.beginTransaction();......

长平狐
2013/01/06
874
0
Hibernate使用原生SQL适应复杂数据查询

HQL尽管容易使用,但是在一些复杂的数据操作上功能有限。特别是在实现复杂的报表统计与计算,以及多表连接查询上往往无能为力,这时可以使用SQL(Native SQL)实现HQL无法完成的任务。 1、使...

boonya
2013/06/05
0
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

崛起于Springboot2.X之开发拦截器(21)

序言:几乎所有项目都需要拦截器,所以小伙伴们必须要掌握这门技术哦,不然只会mybaits增删改查那是实习生干的活呀。 1、创建拦截器类,implements HandlerInterceptor public class MyInce...

木九天
13分钟前
1
0
(转)SQL语句的执行顺序

(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (......

Avner
22分钟前
0
0
1.14 救援模式

确保开机启动时连接镜像文件,如果是真机服务器,就需要:U盘或光盘镜像启动进入BIOS 不同主板进入bios按键不同,一般是F12或Esc 光标:移动到Boot(开机启动项) 减号移动:光标选中行,按-...

小丑鱼00
29分钟前
0
0
ES11-全文检索

高级别全文检索通常用于在全文本字段(如电子邮件正文)上运行全文检索。 他们了解如何分析被查询的字段,并在执行之前将每个字段的分析器(或search_analyzer)应用于查询字符串。 1.term查...

贾峰uk
33分钟前
0
0
java 复制对象有哪些方式

java 复制对象有哪些方式 Apache的 Common beanutils库 org.apache.commons.beanutils.BeanUtils.copyProperties(dest,origin); Springframework 的BeanUtil 依赖: <dependency> ......

黄威
48分钟前
2
0
jstack的简单使用

公司测试反应, 一个java应用的机器, 即使不做交易, cpu始终是30%多, 于是想到了jstack, 实践步骤记录一下: 1, 找出java应用的进程号 ps -ef|grep 应用名|grep -v grep 2, 找出pid下的cpu占用...

零二一七
55分钟前
1
0
导入CSV文件就行数据整理分析

#-*-coding:utf-8-*-import csv,os,re,mathlocalPath=input("请输入所有群文件的根目录:") #所有QQ群文件的物理根目录路径def info(): info_dic=[] dirList=os.listdi...

Kefy
今天
5
0
CoreText进阶(六)-内容大小计算和自动布局

CoreText进阶(六)-内容大小计算和自动布局 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更...

aron1992
今天
1
0
一个Unity高人的博客,涉猎范围很广,深度也很深。

https://blog.csdn.net/ecidevilin/article/list/

爽歪歪ES
今天
0
0
Spring Cloud Config-Git后端

EnvironmentRepository的默认实现使用Git后端,这对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以在Config Server中设置“spring.cloud.config.server.git.uri”配置...

itcloud
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部