`
sungang_1120
  • 浏览: 321642 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Hibernate通过SQL查询常量时只能返回第一个字符的解决方法

阅读更多

在Hibernate中如果通过

 

 

session.createSQLQuery("select '合计' as name from dual").list()  

 

 

 

查询,返回值中只会有一个“合”字。

 

经查,常量在数据库中被认为是CHAR类型的,Hibernate取值时将其保存为Character类型,而Character只能保存一个字符,所以造成返回值中只存在一个字符。Hibernate官方已存在此bug ,却从未修复。

 

该bug中给出2中解决方法:

 

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()  

 

 

 

还有一种解决方法是在SQL中设置该字段的类型,代码如下

session.createSQLQuery("select cast('合计' as varchar(4)) as name from dual").list()  

 

该方法在Oracle和SQL Server中可用。

Hibernate中将SQL查询出来字段转换为对象的方法有两种

1.使用ResultTransformer,代码如下

    query.setResultTransformer(new AliasToBeanResultTransformer(StudentDTO.class)).list()  

 

这种方法要求数据库的字段名和类的属性的大小写必须一致,但是Oracle查询返回的字段名却全是大写。

2.使用addEntity方法,这种方法的缺点是SQL必须写成select * from users的形式或select {a.*},{b.*} from a,b where...的格式。

分享到:
评论

相关推荐

    SQL格式化功能(JAVA代码)

    在给定的标题“SQL格式化功能(JAVA代码)”中,我们聚焦于一个特定的Java实现,它从Hibernate库中抽取了用于SQL格式化的功能,并且不依赖任何第三方jar包。 `Hibernate`是一个流行的Java ORM(对象关系映射)框架...

    SQL转Java代码小工具

    意味着该工具处理的不仅是单行的SQL语句,还能处理复杂的多行查询,将其转换成一个Java字符串常量,这样这个字符串就可以直接在Java代码中被`Statement`、`PreparedStatement`或ORM框架如Hibernate的`Session`对象...

    Hibernate中映射枚举类型

    在Hibernate中映射枚举类型是一个常见的需求,利用好Hibernate提供的工具和自定义映射器可以让我们更加灵活地处理不同场景下的枚举类型映射需求。通过本文介绍的方法,我们可以轻松地将枚举类型的`name`、`ordinal`...

    hibernate连接各种数据库的方法

    ### 使用Hibernate连接各种数据库的方法 #### 一、前言 Hibernate是Java开发中非常流行的ORM(对象关系映射)框架之一,它简化了数据库操作,让开发者能够更加专注于业务逻辑而不是复杂的SQL语句编写。本文将详细...

    hibernate.properties详解

    这部分定义了查询语言的常量和函数名,对于使用Hibernate HQL(Hibernate Query Language)进行查询非常重要。 - **hibernate.query.substitutions**:用于替换查询中的某些值。例如,在这里设置`yes`和`no`的对应...

    解析Hibernate + MySQL中文乱码问题

    本文将深入解析在使用Hibernate框架与MySQL数据库时遇到的中文乱码问题,以及如何解决这一问题。 首先,我们需要理解中文乱码出现的根本原因。当Java应用程序中的持久化类包含中文字符串,并通过Hibernate映射到...

    Hibernate-HQL

    HQL(Hibernate Query Language)是Hibernate提供的一个面向对象的查询语言,它类似于SQL,但更贴近Java对象模型,使得在处理Java对象时查询更加直观和方便。 HQL的主要知识点包括: 1. **基本查询**:HQL支持简单...

    java面试题

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步。在很多情况下采用异步往往更有效率。 数据库三大范式? 答:1:确保每列都是不可分割的原子值 2...

    mybatis学习笔记

    - **定义**:MyBatis是一个支持普通SQL查询、存储过程以及高级映射的优秀持久层框架。它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。 - **特点**: - 简单易用:只需要编写简单的XML映射文件,即可...

    SSH+EXT如何返回JSON

    在这个类中,我们定义了一个名为`locationlist`的方法,该方法用于处理请求并将数据转换为JSON格式。 1. **导入必要的库**: - 首先导入`net.sf.json`库中的`JSONArray`和`JsonConfig`类。 - 其他导入语句主要...

    javasqlTypes数据库字段类型java数据类型的对应关系

    - iBATIS 是一个流行的持久层框架,它允许将SQL语句直接写在XML配置文件中,同时自动处理类型映射。`Developer Guide`文档详细解释了如何在iBATIS中设置和管理这些映射。 5. **Program Dreams 映射 SQL 和 Java ...

    java笔试面试题(含有笔试题,核心技术,重点知识,struts,hibernate,spring,eclipse)

    2. **继承**:继承允许一个类(子类)继承另一个类(父类)的特性和行为。这有助于代码复用和减少冗余代码。继承还提供了层次化的分类结构,使得代码更加灵活和易于扩展。 3. **多态**:多态是指允许不同类的对象对...

    Java开发工程师招聘面试题

    - Hibernate是一个ORM(对象关系映射)框架,通过元数据将Java对象映射到数据库表,简化数据库操作。 14. Hibernate的延迟加载: - 延迟加载意味着当需要对象时才从数据库加载,提高性能,避免了不必要的查询。 ...

    java面试题2

    - `str2`中的`"llo"`是由`new String("llo")`创建的新字符串实例,这意味着它位于堆内存中的一个新的位置,而不是字符串常量池中的位置。 - 因此,`str1 == str2`比较的是引用地址,而不是内容,所以返回`false`。 ...

    IT名企JavaEE面试题最新整理(附答案)

    初始化在Servlet被加载或者第一次访问时进行,服务方法处理客户端请求,销毁则在Servlet卸载时进行。若配置在web.xml中,则Servlet会在Web应用启动时即被加载和初始化。 Servlet与CGI(Common Gateway Interface)...

    Java面试宝典

    7. char型变量可以存储中文字符,因为Java采用UTF-16编码,一个char可以存储一个16位的Unicode字符。 8. 最有效率计算2乘以8的方法是使用移位操作:2 。 9. final关键字用于声明常量,修饰变量时变量值不能被改变...

    康时笔试题.doc

    Struts 是基于 MVC 设计模式的一个 Web 框架,用户请求首先到达 ActionServlet,ActionServlet 决定转发到哪个 Action 处理请求,然后 Action 处理完业务逻辑后将数据返回给 JSP 页面显示。 ### 16. 访问修饰符的...

    总结问题集合

    - **final**:表示一个变量或方法的值在初始化之后不能被改变,常用于创建常量。 - **static**:表示静态成员,意味着该成员属于类本身而不是实例,可以在没有实例化对象的情况下直接访问。 ### 7. Spring 和 ...

    自己总结java笔试面试题

    此外,当字符串常量在代码中被多次使用时,JVM会将其放入字符串池中,以避免重复创建相同的字符串对象,这可以通过`==`来验证两个字符串引用是否指向同一个对象。 ### 3. Unicode与字符编码 Java中,`char`类型...

Global site tag (gtag.js) - Google Analytics