【转】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类 一处理不可变的字符串(一经创建,字符 ...
随机推荐
- 10. 数据模型(ER图)转为sql脚本,要求导出的字段都是大写的
1.进入Tools-->Execute Commands-->Edit/Run Script,执行以下脚本即可实现所有字段转为大写; Option Explicit ValidationM ...
- Selenium Webdriver——操作隐藏的元素
有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了.例如,下面的情况: 页面主要通过“display:none”来控制整个下拉框不可见.这个时候如果直接操作这个下拉框, ...
- win10/win7 笔记本 开启虚拟无线 批处理
Microsoft Virtual WiFi Miniport Adapter 一.看网络网卡 有多出的这一项“Microsoft Virtual WiFi Miniport Adapter”,那么说 ...
- XMLTransformProvider
XMLTransformProvider1 XMLTransformProvider1.TransformRead.SourceXmlDocument := XMLDoc.GetDOMDocument ...
- 浅谈RMI的特点及作用
RMI:远程方法调用(Remote Method Invocation) 扩展:RPC与RMI的区别 1:方法调用方式不同: RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用.每个远 ...
- Tomcat Servlet学习
参照: 浅谈cookie跨域的解决方案——document.domain(http://blog.csdn.net/zhouziyu2011/article/details/61200943) Ser ...
- Others-Goldengate 数据同步
GoldenGate 是一家创建于1995年的美国公司,开发总部设在旧金山,在北美,欧洲和亚洲(包括新加坡.印度.澳大利亚)设有支持中心. 公司名称 GoldenGate 总部地点 旧金山 成立时间 ...
- Elasticsearch之启动(前台和后台)
分为两种情况,取决于是否安装了tomat. 一.若安装了tomcat 1.es的前台启动 需要先启动tomcat,再启动es,否则会报错! 所以,得 2.es的后台启动 [hadoop@HadoopM ...
- 一个完整的Oracle建表的例子
建表一般来说是个挺简单的事情,但是Oracle的建表语句有很多可选的参数,有些我们可能平时不太用,用的时候又不知道怎么用,这里就写一个较完整的建表的例子: [sql] CREATE TABLE ban ...
- CentOS开机卡在进度条,无法正常开机的排查办法
CentOS开机的时候卡在进度条一直进不去 重启,按f5键进度条/命令行界面方式切换,确认卡问题后处理就好 我这边卡在redis服务,设置为开机启动但是一直服务启动不起来 重启按住"e&qu ...