【转】Hibernate的getSQLQuery方法对char类型的解析问题
【转】Hibernate的getSQLQuery方法对char类型的解析问题
建立数据库:
create table T_TEST1(
id char (32),
name varchar (255),
other varchar (255),
primary key(id)
)insert into T_TEST1 values('2c9090792a18d6ab012a18d77e700001','sfasdf','asdf')
insert into T_TEST1 values('2c9090792a18e5a5012a18e5ea830001','ddd','eeee')
insert into T_TEST1 values('3001','ddd','eeee')
insert into T_TEST1 values('haha','ddd','eeee')
查询结果正常,如下:

现在通过hibernate来查询。
Session session = HibernateSessionFactory.getSession();
Transaction ts = ession.beginTransaction();
String sHQL = " select * from T_TEST1 ";
Query query = session.createSQLQuery(sHQL);
List list = query.list();
得到的结果如下:

可见第一列的id与数据库不一致,结果取得是数据库中的第一位。经过种种实验,得出结论,由于数据库中我们定义了id为char型,而hibernate自动会把char(n)转换为char(1)型,所以出现了上面的结果。
知道了什么原因,我们就可以思考解决方案了。
1) 把数据库方言做一下约束
在hibernate.hbm.xml中修改数据库方言为我们自定义的。
<property name="dialect">com.ying.LongCharDialect</property>
重新定义一个新的方言类,使char型的数据映射为String类型
public class LongCharDialect extends SybaseDialect {
public LongCharDialect(){
super();
registerHibernateType(Types.CHAR, Hibernate.STRING.getName());
}
}
2) 调用addScalar()方法
Query query = session.createSQLQuery(sHQL).addScalar("id", Hibernate.STRING).addScalar("name");
这样就解决了CHAR字段类型只出一位字符的问题。 但是需要把其他字段也addScalar()进来! addScalar(String arg)里的参数是需要大写的!
3) 换用session.createQuery()方法,用HQL语言来查询,因为HQL语言全部把数据库映射成POJO和XML文件了,在XML文件中就有对应的映射规则,在里面我们把char类型的字段映射成String类型就行了。这样我们用createQuery()方法就能返回一个个的POJO类型的对象。
4) 调用addEntity()方法,这个的前提也是得定义了映射实体类。
Query query = session.createSQLQuery(sHQL).addEntity(TTest1.class);
至此,已解决,不过还是建议不要用char类型,有那么好的varchar,为啥不用呢?
【转】Hibernate的getSQLQuery方法对char类型的解析问题的更多相关文章
- java如何将char类型的数字转换成int型的数字,而不是Ascii
如何把 char ‘3’ 转为 int 3, 大家应该知道,不能直接转化,那样得到是‘3’的Ascii. 如下面: public class Leet { public static void mai ...
- Oracle数据库中字段定义为Char类型,Hibernate用该字段进行动态绑定参数查询,获取不到结果的问题
一.问题背景 产生环境:oracle数据库,hibernate操作 定义了一个表 create table STORE_INFORMATION ( id CHAR(32) not null, name ...
- 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好
HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...
- 在vs中char类型的实参与LPCWSTR类型的形参类型不兼容怎么解决?
今天在做 COS脚本解释器的时候,遇到了这个问题 先了解一下 LPCTCHAR 这个东东 LPCTSTR用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么 ...
- NSString / NSData / char* 类型之间的转换
转自网络: NSString / NSData / char* 类型之间的转换 1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; ch ...
- 浅析为什么char类型的范围是 —128~+127
转载于daiyutage 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来 ...
- c++ string类型转换为char *类型
string 是c++标准库里面其中一个,封装了对字符串的操作 把string转换为char* 有3中方法: 1.data 如: string str="abc"; char *p ...
- Hibernate的注解方法的使用
1.配置映射关系的xml方式 我们知道,Hibernate是一个典型的ORM框架,用以解决对象和关系的不匹配.其思想就是将关系数据库中表的记录映射成为对象,以对象形式展现,这样一来,就可以把对数据库的 ...
- 字符、字符串和文本的处理之Char类型
.Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...
随机推荐
- python入门-异常
1 报错的例子 print(5/0) 2跳过报错的例子 try: print(5/0) except ZeroDivisionError: print("You can't divide b ...
- 表单:提交验证,及blur事件验证
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- spring中 的MD5 加密
//对密码进行加密(不需要使用其他Md5工具 .spring中有 在digestUtils) String password = DigestUtils.md5DigestAsHex( ...
- redis详解(三)
1. 使用redis有哪些好处? (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2) 支持丰富数据类型,支持string,li ...
- [ilink32 Error] Error: Unresolved external 'SendARP'
[ilink32 Error] Error: Unresolved external 'SendARP' referenced from E:\APPOBJ\KSRGETMAC.OBJ #pragma ...
- setlocal 与 变量延迟
setlocal 与 变量延迟 本条内容引用[英雄出品]的批处理教程: 要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看. 为了更好的说明问题,我们先引入一个例子.例1: @echo off ...
- 在eclipse中创建maven项目,亲测有效,详细步骤
一.想要使用maven,首先要配置本地maven的环境 1.在http://maven.apache.org/download.cgi中去下载maven 2. 3.下载完毕后将压缩包解压到自己记住的位 ...
- UITableView cell 半透明效果,改变cell高度时背景不闪的解决方法
如果直接指定cell.backgroundColor = = [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 ...
- jquery.ajax的url中传递中文乱码问题的解决方法
jquery.ajax的url中传递中文乱码问题的解决方法 JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQu ...
- NUMA体系结构介绍
为什么会有NUMA? 在NUMA架构出现前,CPU欢快的朝着频率越来越高的方向发展.受到物理极限的挑战,又转为核数越来越多的方向发展.如果每个core的工作性质都是share-nothing(类似于m ...