【转】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类型的解析问题的更多相关文章

  1. java如何将char类型的数字转换成int型的数字,而不是Ascii

    如何把 char ‘3’ 转为 int 3, 大家应该知道,不能直接转化,那样得到是‘3’的Ascii. 如下面: public class Leet { public static void mai ...

  2. Oracle数据库中字段定义为Char类型,Hibernate用该字段进行动态绑定参数查询,获取不到结果的问题

    一.问题背景 产生环境:oracle数据库,hibernate操作 定义了一个表 create table STORE_INFORMATION ( id CHAR(32) not null, name ...

  3. 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好

    HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...

  4. 在vs中char类型的实参与LPCWSTR类型的形参类型不兼容怎么解决?

    今天在做 COS脚本解释器的时候,遇到了这个问题 先了解一下 LPCTCHAR 这个东东 LPCTSTR用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么 ...

  5. NSString / NSData / char* 类型之间的转换

    转自网络: NSString / NSData / char* 类型之间的转换 1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; ch ...

  6. 浅析为什么char类型的范围是 —128~+127

    转载于daiyutage 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来 ...

  7. c++ string类型转换为char *类型

    string 是c++标准库里面其中一个,封装了对字符串的操作 把string转换为char* 有3中方法: 1.data 如: string str="abc"; char *p ...

  8. Hibernate的注解方法的使用

    1.配置映射关系的xml方式 我们知道,Hibernate是一个典型的ORM框架,用以解决对象和关系的不匹配.其思想就是将关系数据库中表的记录映射成为对象,以对象形式展现,这样一来,就可以把对数据库的 ...

  9. 字符、字符串和文本的处理之Char类型

    .Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...

随机推荐

  1. ldap复制

    1.使用yum命令安装openldap,openldap-servers,openldap-clients $ yum install openldap $ yum install openldap- ...

  2. 23. oralce11g导出dmp然后导入Oracle10g

    解决方法: 一.在11g服务器上,使用expdp命令备份数据 EXPDP USERID='fjgs/fjgs@orcl' schemas=fjgs directory=DATA_PUMP_DIR du ...

  3. Linux tomcat启动慢, Creation of SecureRandom instance for session ID generation using [SHA1PRNG]took [xx] mil

    启动慢的解决链接:  http://blog.csdn.net/u011627980/article/details/54024974

  4. ABAP-关于隐式与显式的DB Commit

    转载:https://www.cnblogs.com/liaojunbo/archive/2011/07/11/2103491.html 1.显式的DB Commit 显式的DB Commit并没有对 ...

  5. [ERR] Not all 16384 slots are covered by nodes.

    redis集群开不起来,用redis-cli连接的时候出现如下错误: CLUSTERDOWN The cluster is down 然后使用redis-trib.rb检查: ./redis-trib ...

  6. Can not find the tag library descriptor for "http://www.springframework.org/tags"

    1.Download the Spring dependency jar2.Place it to the lib folder path is /WEB-INF/lib/spring.jar 3.T ...

  7. ubuntu 安装 selenium selenium操作 chrome

    重装虚拟机,好多包需要重装,sele这个记得当时就找了好久的完整重装方法,这次又找了好久,,,省的下次再这样,记录下来..... ubuntu16.04 4安装seleniumsudo pip ins ...

  8. 集成学习算法总结----Boosting和Bagging(转)

    1.集成学习概述 1.1 集成学习概述 集成学习在机器学习算法中具有较高的准去率,不足之处就是模型的训练过程可能比较复杂,效率不是很高.目前接触较多的集成学习主要有2种:基于Boosting的和基于B ...

  9. android笔记:Service

    服务:在后台运行,没有界面的组件. 服务生命周期如下: 两种启动方式: 1.startService(): onCreate()-->onStartCommand()-->onDestro ...

  10. for of 与 for in 的区别

    遍历数组通常使用for循环,ES5的话也可以使用forEach,ES5具有遍历数组功能的还有map.filter.some.every.reduce.reduceRight等,只不过他们的返回结果不一 ...