`
yanlp
  • 浏览: 76865 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

hibernate多表查询映射对象

阅读更多

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

    假设有个值对像,如下:

Java代码 复制代码
  1. package test;      
  2.      
  3. public class Person {      
  4.     private Long id;      
  5.     private String name;      
  6.     private Long age;      
  7.     private Long phone;      
  8.     private String address;      
  9.      
  10.     public Person(Long id, String name, Long age, Long phone, String address) {      
  11.         this.id = id;      
  12.         this.name = name;      
  13.         this.age = age;      
  14.         this.phone = phone;      
  15.         this.address = address;      
  16.     }      
  17.      
  18.     public Long getId() {      
  19.         return id;      
  20.     }      
  21.      
  22.     public void setId(Long id) {      
  23.         this.id = id;      
  24.     }      
  25.      
  26.     public String getName() {      
  27.         return name;      
  28.     }      
  29.      
  30.     public void setName(String name) {      
  31.         this.name = name;      
  32.     }      
  33.      
  34.     public Long getAge() {      
  35.         return age;      
  36.     }      
  37.      
  38.     public void setAge(Long age) {      
  39.         this.age = age;      
  40.     }      
  41.      
  42.     public Long getPhone() {      
  43.         return phone;      
  44.     }      
  45.      
  46.     public void setPhone(Long phone) {      
  47.         this.phone = phone;      
  48.     }      
  49.      
  50.     public String getAddress() {      
  51.         return address;      
  52.     }      
  53.      
  54.     public void setAddress(String address) {      
  55.         this.address = address;      
  56.     }      
  57. }     
  58.   
  59. package test;   
  60.   
  61. public class Person {   
  62.     private Long id;   
  63.     private String name;   
  64.     private Long age;   
  65.     private Long phone;   
  66.     private String address;   
  67.   
  68.     public Person(Long id, String name, Long age, Long phone, String address) {   
  69.         this.id = id;   
  70.         this.name = name;   
  71.         this.age = age;   
  72.         this.phone = phone;   
  73.         this.address = address;   
  74.     }   
  75.   
  76.     public Long getId() {   
  77.         return id;   
  78.     }   
  79.   
  80.     public void setId(Long id) {   
  81.         this.id = id;   
  82.     }   
  83.   
  84.     public String getName() {   
  85.         return name;   
  86.     }   
  87.   
  88.     public void setName(String name) {   
  89.         this.name = name;   
  90.     }   
  91.   
  92.     public Long getAge() {   
  93.         return age;   
  94.     }   
  95.   
  96.     public void setAge(Long age) {   
  97.         this.age = age;   
  98.     }   
  99.   
  100.     public Long getPhone() {   
  101.         return phone;   
  102.     }   
  103.   
  104.     public void setPhone(Long phone) {   
  105.         this.phone = phone;   
  106.     }   
  107.   
  108.     public String getAddress() {   
  109.         return address;   
  110.     }   
  111.   
  112.     public void setAddress(String address) {   
  113.         this.address = address;   
  114.     }   
  115. }    
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;
    }
}  

 

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

Java代码 复制代码
  1. List list = getHibernateTemplate().loadAll(Person.class);     
  2.   
  3. List list = getHibernateTemplate().loadAll(Person.class);    
List list = getHibernateTemplate().loadAll(Person.class);  

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

 

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

Java代码 复制代码
  1. public Person(Long id, String name, Long age) {      
  2.     this.id = id;      
  3.     this.name = name;      
  4.     this.age = age;      
  5. }     
  6.   
  7.     public Person(Long id, String name, Long age) {   
  8.         this.id = id;   
  9.         this.name = name;   
  10.         this.age = age;   
  11.     }      
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来进行查询。

Java代码 复制代码
  1. List list = getHibernateTemplate().find("select new test.Person(id,name,age) from Person");     
  2.   
  3. 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");  

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


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

Java代码 复制代码
  1. List list = getSession().createQuery("select id,name,phone from person").addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long).addEntity(Person.class);     
  2.   
  3. 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);  

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。

Java代码 复制代码
  1. List list = getSession().createSQLQuery("select id \"id\",name \"name\",phone \"phone\" from person")      
  2.                     .addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long)      
  3.                     .setResultTransformer(Transformers.aliasToBean(Person.class)));     
  4.   
  5. List list = getSession().createSQLQuery("select id \"id\",name \"name\",phone \"phone\" from person")   
  6.                     .addScalar("id",Hibernate.Long).addScalar("name").addScalar("phone",Hibernate.Long)   
  7.                     .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)));  

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。

Java代码 复制代码
  1.     
  2. List list = getSession().createSQLQuery("select * from person")      
  3.                     .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);     
  4.   
  5. List list = getSession().createSQLQuery("select * from person")   
  6.                     .setResultTransformer(Transformers.ALIAS_TO_ENTITY_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。

Java代码 复制代码
  1. List list = getSession().createSQLQuery("select * from person")      
  2.                     .setResultTransformer(Transformers.T0_LIST);     
  3.   
  4. List list = getSession().createSQLQuery("select * from person")   
  5.                     .setResultTransformer(Transformers.T0_LIST);  
List list = getSession().createSQLQuery("select * from person")   
                    .setResultTransformer(Transformers.T0_LIST);  

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



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

转自:http://zpball.iteye.com/blog/681165#

分享到:
评论

相关推荐

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    Hibernate连表查询 Hibernate连表查询

    通过对HBM映射文件的理解、DAO层的连表查询实现以及查询结果的处理等几个方面进行了详细解释。在实际项目中,合理运用这些技巧可以极大地提高开发效率和代码质量。需要注意的是,在编写连表查询时要充分考虑性能问题...

    hibernate 映射关系学习入门 多对多实体映射

    Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,从而实现了面向对象编程和关系数据库之间的桥梁。Hibernate提供了强大的查询语言HQL(Hibernate Query Language)以及 ...

    Hibernate对象关系映射

    Hibernate对象关系映射一对多 很基础等文档

    Hibernate初之单表映射学习例子

    10. **实体关系映射**:虽然标题提到“单表映射”,但可以扩展讨论到多对一、一对多、多对多等关联关系的映射。 通过这个“Hibernate初之单表映射学习例子”,初学者可以掌握Hibernate的基本操作,为进一步深入学习...

    springmvc+hibernate多表映射

    在多表映射中,Hibernate允许我们定义实体类之间的关系,如一对一、一对多、多对一和多对多关系。 在“一对多”关系中,一个实体可以对应多个其他实体。例如,一个部门可以有多个员工。在Hibernate中,我们通过在...

    hibernate单向多对多映射(XML版)

    在Hibernate中,实现多对多映射通常涉及三个元素:实体类、关联表(也称为中间表)以及XML映射文件。实体类代表数据库中的表,而关联表则用于存储双方实体的关联关系。XML映射文件是 Hibernate 了解这些实体及其关系...

    hibernate映射和查询

    在 Hibernate 中,对象关系映射(ORM)是将数据库表映射到 Java 类的过程。这个过程通过 `hibernate.cfg.xml` 配置文件和实体类(Entity Class)来实现。在 `hibernate.cfg.xml` 文件中,我们配置数据库连接参数,如...

    Hibernate查询映射试验

    在这个“Hibernate查询映射试验”项目中,你可能会遇到如何配置SessionFactory、如何创建和执行HQL/Criteria查询、如何处理关联映射(如一对一、一对多、多对多)、如何使用事务管理等实践环节。理解并熟练掌握这些...

    hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

    在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...

    Hibernate XML配置表映射实例

    在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为对Java对象的操作,极大地简化了数据库编程。在本实例中,我们将深入探讨如何使用XML配置文件来实现Hibernate的表...

    Hibernate使用 Map实现多对多映射

    在Java的持久化框架Hibernate中,多对多映射是一种常见的关系映射方式,用于处理两个实体类之间一对多或多对一的关系。在这个例子中,我们看到的是`Team`(团队)与`Member`(成员)之间的多对多关系,通过`Map`数据...

    hibernate 多对多映射实例,学生 选课

    总的来说,这个“hibernate 多对多 映射实例,学生 选课”项目涵盖了Hibernate的多对多关系映射、数据库设计、对象模型构建、事务管理等多个方面,是一个很好的学习和实践Hibernate的实战案例。通过深入理解和实践这...

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

    在某些情况下,本地SQL查询的性能可能会优于HQL,因为它避免了Hibernate对HQL的解析和转换过程。 要将本地SQL查询的结果封装成对象,我们首先需要定义一个映射文件(.hbm.xml),在这个文件中,我们需要指定查询...

    hibernate set 集合映射

    3. **关联映射**:集合映射通常涉及到两个实体之间的关联,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)关系。 4. **集合属性映射**:在实体类中,集合属性需要使用...

    Hibernate多对多的映射

    添加、删除和查询多对多关系可以通过简单的集合操作实现,因为Hibernate会自动处理中间表的插入和删除: ```java Student student = new Student(); Course course = new Course(); // 添加关系 student....

    Hibernate高级映射实例

    本实例主要探讨的是Hibernate的高级映射技术,包括单向一对一、单向多对一、单向一对多以及单向多对多这四种关系映射。 首先,我们来理解一下什么是映射。在Hibernate中,映射是将对象模型与关系数据库之间的桥梁,...

    hibernate array 数组映射

    在Hibernate中,数组映射是将数据库表的一列或多列数据映射到Java对象的一个数组属性上。数组可以是基本类型数组或对象类型的数组。这种映射方式简化了数据访问,并提高了代码的可读性和可维护性。 ### 配置数组...

Global site tag (gtag.js) - Google Analytics