【转】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. 使用Apache POI处理excel公式不更新的解决办法

    使用poi更新excel时,如果单元格A设置了公式,当其依赖的其他单元格填充了值之后,导出的excel中A仍为公式而不是自动计算的值,如图: Paste_Image.png 分值小计没有更新成计算结果 ...

  2. 5.Struts2配置形式,覆盖

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 下面以对struts.i18n.encoding=UTF-8的配置为例进行说 ...

  3. ListView 操作

    TListItem *Item; ; i < ; i++) { Item = ListView1->Items->Add(); Item->Caption = i; } Lis ...

  4. UI5-文档-4.38-Accessibility

    作为本教程的最后一步,我们将改进应用程序的可访问性. 为此,我们将添加ARIA属性.屏幕阅读器使用ARIA属性识别应用程序结构并正确解释UI元素.通过这种方式,我们可以让我们的应用程序对那些使用电脑有 ...

  5. JAVA NIO学习记录1-buffer和channel

    什么是NIO? Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用的方式完全不 ...

  6. git命令图片

  7. pycharm ideavimrc设置备忘

    文件存放位置 windows下 C:\Users\你的用户名\.ideavimrc 注:如果要映射pycharm 中的一些命令可以 在pycharm 中 edit->Macros->Sta ...

  8. scala -- 传名参数

    object Test{ def main(args: Array[String]): Unit = { def test(code : => Unit){// 传名参数 不计算函数值,而是把函 ...

  9. oracle系统视图字段说明

    oracle系统表v$session.v$sql表的列字段说明‍ 在本视图中,每一个连接到数据库实例中的 session都拥有一条记录.包括用户 session及后台进程如 DBWR, LGWR, a ...

  10. JVM7、8详解及优化

    一.引言:永久代为什么被移出HotSpot JVM了? 详见:JEP 122: Remove the Permanent Generation 原因主要有两个: 1.由于Permanent Gener ...