常量在数据库中被认为是CHAR类型的,Hibernate取值时将其保存为Character类型,而Character只能保存一个字符,所以造成返回值中只存在一个字符。Hibernate官方已存在此bug ,却从未修复。
该BUG给出两种解决方案:
1.继承一个Dialect,并注册CHAR类型的对应方式。代码如下
- public class MySQLServerDialect extends org.hibernate.dialect.SQLServerDialect
- {
- public MySQLServerDialect()
- {
- super();
- //very important, mapping char(n) to String
- registerHibernateType(Types.CHAR, Hibernate.STRING.getName());
- }
- }
2.设置字段对应的类型(缺点是如果查询很多字段,每个字段都必须设置,没设置类型的字段在结果集中是不存在的),代码如session.createSQLQuery("select '汉字测试as name from dual").addScalar("name", Hibernate.STRING).list()
3.还有一种解决方法是在SQL中设置该字段的类型,代码如下 ,我用的是该种方法,其他的没有验证:
select cast(case status when 1 then '已回复' else '未回复' end as varchar2(20)) from baseinfo
该方法在Oracle和SQL Server中可用。
4.还有一种我自己实验出来的不一定适用 就是在查询的汉字之间加几个空格就可以了,但是这样展示的时候会出现空格
select case status when ’1‘ then ’已 回复‘ else ’未 回复‘ end as status from baseinfo
原文链接:http://blog.csdn.net/z69183787/article/details/12016833