`
zpball
  • 浏览: 914705 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解决Hibernate原生SQL映射问题

阅读更多
在问答里和论坛中,经常看到有人问,怎样将使用本地SQL查询出来的结果映射为值对象的问题,这里就Hibernate中提供的方法做个结论。前提,这里没有使用属性的延迟加载技术。

    假设有个值对像,如下:

package test;   
  
public class Person {   
    private Long id;   
    private String name;   
    private Long age;   
    private Long phone;   
    private String address;   
  
    public Person(Long id, String name, Long age, Long phone, String address) {   
        this.id = id;   
        this.name = name;   
        this.age = age;   
        this.phone = phone;   
        this.address = address;   
    }   
  
    public Long getId() {   
        return id;   
    }   
  
    public void setId(Long id) {   
        this.id = id;   
    }   
  
    public String getName() {   
        return name;   
    }   
  
    public void setName(String name) {   
        this.name = name;   
    }   
  
    public Long getAge() {   
        return age;   
    }   
  
    public void setAge(Long age) {   
        this.age = age;   
    }   
  
    public Long getPhone() {   
        return phone;   
    }   
  
    public void setPhone(Long phone) {   
        this.phone = phone;   
    }   
  
    public String getAddress() {   
        return address;   
    }   
  
    public void setAddress(String address) {   
        this.address = address;   
    }   
}  

package test;

public class Person {
    private Long id;
    private String name;
    private Long age;
    private Long phone;
    private String address;

    public Person(Long id, String name, Long age, Long phone, String address) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.phone = phone;
        this.address = address;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getAge() {
        return age;
    }

    public void setAge(Long age) {
        this.age = age;
    }

    public Long getPhone() {
        return phone;
    }

    public void setPhone(Long phone) {
        this.phone = phone;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}  
 

如果查询全部五列记录的话,那么只要

List list = getHibernateTemplate().loadAll(Person.class);  

List list = getHibernateTemplate().loadAll(Person.class);  
 

如果只需要查询id,name,age三列记录呢?那么就要新增构造方法了,

public Person(Long id, String name, Long age) {   
    this.id = id;   
    this.name = name;   
    this.age = age;   
}  

	public Person(Long id, String name, Long age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}    

然后呢,就可以通过HQL来进行查询。

List list = getHibernateTemplate().find("select new test.Person(id,name,age) from Person");  

List list = getHibernateTemplate().find("select new test.Person(id,name,age) from Person");    

这个方法通常可以满足需要了,只是如果,只需要查询id,name,phone三列记录的话,还新增构造方法?不行了,会出现构造方法冲突了。有个办法:

List list = getSession().createQuery("select id,name,phone from person").addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long).addEntity(Person.class);  

List list = getSession().createQuery("select id,name,phone from person").addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long).addEntity(Person.class);  
 
但是,这个只适用于存在Person实体的,如果Hibernate中没有进行Person映射的呢,系统中只存在一个JavaBean。
List list = getSession().createSQLQuery("select id \"id\",name \"name\",phone \"phone\" from person")   
                    .addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long)   
                    .setResultTransformer(Transformers.aliasToBean(Person.class)));  

List list = getSession().createSQLQuery("select id \"id\",name \"name\",phone \"phone\" from person")
					.addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long)
					.setResultTransformer(Transformers.aliasToBean(Person.class)));    

那么Hibernate就会自动将查出来的三列内容组装到VO对象中去,只是代码量有点大,而且名称都需要重新定义为小写的,在Oracle中查出来的列都默认为大写的(不知道其它数据库怎么样)

    这个办法就不依赖于构造方法了,只需要定义私有变量,设置getter/setter方法就行了。

    不过如果更猛点的,根本就没有JavaBean对象可以填充怎么办,Hibernate可以将查出来的列组装到集合类中去。如Map。

 
List list = getSession().createSQLQuery("select * from person")   
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);  

List list = getSession().createSQLQuery("select * from person")
                    .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); 


除了这个Transformers还可以将列转化为List。
List list = getSession().createSQLQuery("select * from person")   
                    .setResultTransformer(Transformers.T0_LIST);  

List list = getSession().createSQLQuery("select * from person")
                    .setResultTransformer(Transformers.T0_LIST);


到此,还可以通过继承Transformers将结果映射为其它对象,不累述了,基本功能够用了。

分享到:
评论

相关推荐

    hibernate执行原生sql语句

    "hibernate执行原生sql语句" Hibernate 是一种流行的 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到关系数据库中。然而,在一些情况下,我们需要直接执行原生 SQL 语句,而不是使用 Hibernate 的...

    hibernate 执行原生sql的几种方式

    在Java的持久化框架...在使用原生SQL时,需要注意数据库兼容性、事务管理和结果集映射等问题。在大多数情况下,应尽量利用Hibernate的ORM能力,但在处理特定数据库特性和性能优化时,原生SQL是不可或缺的工具。

    spring+hibernate,自己封装了原生sql的处理,模仿mybatis使用

    描述中提到"自己封装了原生sql的处理,模仿mybatis使用",这意味着开发者在项目中创建了一个类似MyBatis的简单SQL解析器。MyBatis是一个轻量级的持久层框架,它允许开发者编写原生的SQL语句并将其与Java代码绑定。...

    Hibernate之原生Native SQL查询

    当然,原生SQL查询也有一些需要注意的地方。由于直接操作SQL,所以数据库的兼容性问题需要开发者自己处理。此外,如果查询结果需要映射到多个实体类,或者返回复杂的结果集,那么处理起来可能会比较麻烦,需要手动...

    Hibernate中的查询:HQL、Criteria、原生SQl

    本篇文章将深入探讨Hibernate中的三种主要查询方式:HQL(Hibernate Query Language)、Criteria API以及原生SQL。 一、HQL(Hibernate Query Language) HQL是Hibernate提供的一种面向对象的查询语言,它类似于SQL...

    Hibernate 函数 ,子查询 和原生SQL查询

    **Hibernate函数** ...当ORM无法满足需求时,原生SQL查询则提供了一种灵活的方式,以直接操作数据库的能力来解决特定问题。理解和熟练运用这些特性,对于提升Java开发中的数据库操作效率至关重要。

    Hibernate中Sql语句

    虽然HQL是Hibernate提供的面向对象的语言,能够方便地映射到Java对象,但在某些场景下使用原生SQL更加灵活高效,例如: - **复杂查询**:当需要执行复杂的数据库操作时,如分组、聚合、子查询等,原生SQL能更好地...

    Hibernate SQLQuery执行原生SQL.docx

    本文将深入探讨Hibernate如何通过SQLQuery接口执行原生SQL查询,并展示如何处理查询结果。 一、创建SQLQuery对象 在Hibernate中,我们通常通过Session接口的createSQLQuery方法来创建SQLQuery对象,例如: ```...

    Hibernate+本地SQL查询SQLQuery宣贯.pdf

    总之,Hibernate的SQLQuery接口提供了一种灵活的方式来执行原生SQL查询,并将结果映射到Java对象。通过使用别名、结果集映射和命名SQL查询,开发者可以处理复杂的数据库交互,同时保持代码的清晰和整洁。

    hibernate数据库通用SQL代码

    查询数据的方法有两种实现,一种是基于HQL(Hibernate Query Language),另一种是基于原生SQL。 - 基于HQL的通用查询: HQL是Hibernate提供的面向对象的查询语言,可以方便地操作对象和属性。`select`方法接收一个...

    hibernate将本地SQL查询结果封装成对象

    首先,本地SQL查询(Native SQL)是指直接在Hibernate中使用原生的SQL语句进行查询,而不是使用HQL(Hibernate Query Language)。这允许开发者充分利用SQL的功能,比如进行复杂的统计计算或者处理特定数据库的特性...

    struts+hibernate+sql server2005分页的小项目

    由于Hibernate支持SQL Server 2005,因此我们可以通过HQL(Hibernate Query Language)或者原生SQL来实现分页查询。 **4. 分页实现** 在本项目中,分页通常包含以下步骤: - **计算总记录数**:使用Hibernate的...

    mybatis,ibatis,hibernate 显示查询SQL

    MyBatis 的主要特点是灵活的SQL映射,通过XML或注解方式配置和映射原生信息,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。为了显示查询SQL,MyBatis 提供了日志配置,通常...

    Hibernate SQLQuery 查询Oracle char类型结果为一个字符解决方法

    在Hibernate中执行原生SQL查询时,可以通过`addScalar`方法指定返回值的类型,从而改变Hibernate对char类型字段的处理方式。具体操作如下: ```java Session session = this.getSession(); SQLQuery query = ...

    Hibernat使用原生的SQL

    标题 "Hibernat使用原生的SQL" 涉及的是在Java开发中如何利用Hibernate框架执行自定义的SQL语句。Hibernate是一个流行的...为了进一步学习,建议阅读该文档,进行实际的编码练习,以加深对Hibernate原生SQL使用的理解。

    hibernate源码分析过程

    Hibernate 支持 native SQL 操作,可以使用原生 SQL 语句来查询对象。 性能 Hibernate 的性能可以通过一级缓存和二级缓存来提高。一级缓存可以缓存对象的状态,二级缓存可以缓存查询结果。 Hibernate 也支持第三方...

    hibernate将本地SQL查询结果封装成对象(最终).zip

    Hibernate支持两种类型的查询:原生SQL查询和Hibernate查询语言(HQL)。原生SQL查询允许开发者直接执行SQL语句,而HQL则是面向对象的查询语言,类似于SQL但更接近于Java。 4. 封装SQL查询结果为对象: - `...

    hibernate3中通过nativesql或取部分字段并映射为具体对象的实现

    `Hibernate3` 提供了丰富的API来实现这样的功能,包括使用原生SQL(Native SQL)进行查询,然后将查询结果映射到Java对象上。这篇博客探讨了如何在Hibernate3中通过原生SQL获取部分字段,并将这些数据映射到具体的...

    hibernate映射心得 原创

    5. **查询语言**:HQL(Hibernate Query Language)和 Criteria API的使用,以及与原生SQL的比较。 6. **懒加载与即时加载**:理解Hibernate的懒加载机制,以及何时选择即时加载以优化性能。 7. **缓存机制**:一级...

    Hibernate+本地SQL查询SQLQuery.pdf

    原生SQL查询可能返回单一标量值或混合标量值与实体的结果。例如,查询猫的最大体重: ```java Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat") .addScalar(...

Global site tag (gtag.js) - Google Analytics