【转】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. 序列化和反序列化(json 和pickle)dumps 为序列化, json为反序列化

    json 可以在不同语言中进行使用 下面先介绍一下json的适用方法 import json, pickle t1 = { 'name':'alex', ', ' } t1 = json.dumps( ...

  2. javarscript在HTML中的调用方式 (直接调用 和文件调用)

    //文件调用<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  3. 正则表达式(Swift)

    课题 使用正则表达式匹配字符串 使用正则表达式 "\d{3}-(\d{4})-\d{2}" 匹配字符串 "123-4567-89" 返回匹配结果:'" ...

  4. Python使用Threading模块创建线程

    使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法: #!/usr/bin/python # -*- coding: UTF-8 ...

  5. delphi常用函数和方法

     uses ShellApi, ActiveX, ComObj, ShlObj; function HasText(Text: string; const Values: array of strin ...

  6. 吴裕雄 python神经网络 水果图片识别(2)

    import osimport numpy as npimport matplotlib.pyplot as pltfrom skimage import color,data,transform,i ...

  7. CentOS7使用yum详细搭建zabbix3.2过程

    本文引用于:http://blog.csdn.net/s3275492383/article/details/62417210 一.准备搭建环境: 1.系统:CentOS7 2.默认有使用linux服 ...

  8. Haddop SHUTDOWN_MSG: Shutting down NameNode at java.net.UnknownHostException: process01: process01: unknown error

    SHUTDOWN_MSG: Shutting down NameNode at java.net.UnknownHostException: process01: process01: unknown ...

  9. org.Hs.eg.db包简介(转换NCBI、ensemble等数据库中基因ID,symbol等之间的转换)

    1)安装载入 ------------------------------------------- if("org.Hs.eg.db" %in% rownames(install ...

  10. spring boot 启动方式

    一:IDE 运行Application这个类的main方法 二:在springboot的应用的根目录下运行mvn spring-boot:run 三:使用mvn install 生成jar后运行 先到 ...