- 浏览: 76865 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
higher141125:
顶,但是word转换成PDF,报错:Exception in ...
通过jacob 把word转pdf ,excel转html,word转html -
junfengcode:
好文,学习了
Apache+tomcat集群 -
木石流云:
能用两个数据库实现数据库共享的集群吗 不然多个tomcat都是 ...
Apache+tomcat集群 -
wdq:
介绍的很详细!的确不错,学习中!
Apache+tomcat集群
在问答里和论坛中,经常看到有人问,怎样将使用本地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;
- }
- }
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);
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;
- }
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");
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);
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)));
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);
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);
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#
发表评论
-
sax解析xml
2012-03-16 16:58 964sax方式解析xml的优点: 只要有jdk的 ... -
windows下查看端口命令
2011-04-18 10:43 2812启动apache提示80端口busy被占用。于是查看一看80端 ... -
商业应用中Java浮点数的精确计算及表示
2011-04-08 16:53 824问题提出(1)、浮点数 ... -
java读取纯真数据库
2011-03-25 14:21 1017IPEntry.java package test; /* ... -
ckeditor的详细配置
2011-03-03 18:00 1152一、使用方法: 1、在页面<head>中引入ck ... -
myeclipse6 .0 .1 注册码
2011-02-25 23:20 743package test; import java.io.* ... -
list排序中Comparable Comparator的区别
2010-07-26 14:49 1404当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comp ...
相关推荐
在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...
通过对HBM映射文件的理解、DAO层的连表查询实现以及查询结果的处理等几个方面进行了详细解释。在实际项目中,合理运用这些技巧可以极大地提高开发效率和代码质量。需要注意的是,在编写连表查询时要充分考虑性能问题...
Hibernate是一个对象关系映射(ORM)框架,它允许我们将Java对象(实体)与数据库表进行映射,从而实现了面向对象编程和关系数据库之间的桥梁。Hibernate提供了强大的查询语言HQL(Hibernate Query Language)以及 ...
Hibernate对象关系映射一对多 很基础等文档
10. **实体关系映射**:虽然标题提到“单表映射”,但可以扩展讨论到多对一、一对多、多对多等关联关系的映射。 通过这个“Hibernate初之单表映射学习例子”,初学者可以掌握Hibernate的基本操作,为进一步深入学习...
在多表映射中,Hibernate允许我们定义实体类之间的关系,如一对一、一对多、多对一和多对多关系。 在“一对多”关系中,一个实体可以对应多个其他实体。例如,一个部门可以有多个员工。在Hibernate中,我们通过在...
在Hibernate中,实现多对多映射通常涉及三个元素:实体类、关联表(也称为中间表)以及XML映射文件。实体类代表数据库中的表,而关联表则用于存储双方实体的关联关系。XML映射文件是 Hibernate 了解这些实体及其关系...
在 Hibernate 中,对象关系映射(ORM)是将数据库表映射到 Java 类的过程。这个过程通过 `hibernate.cfg.xml` 配置文件和实体类(Entity Class)来实现。在 `hibernate.cfg.xml` 文件中,我们配置数据库连接参数,如...
在这个“Hibernate查询映射试验”项目中,你可能会遇到如何配置SessionFactory、如何创建和执行HQL/Criteria查询、如何处理关联映射(如一对一、一对多、多对多)、如何使用事务管理等实践环节。理解并熟练掌握这些...
在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...
在Java世界中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者将数据库操作转换为对Java对象的操作,极大地简化了数据库编程。在本实例中,我们将深入探讨如何使用XML配置文件来实现Hibernate的表...
在Java的持久化框架Hibernate中,多对多映射是一种常见的关系映射方式,用于处理两个实体类之间一对多或多对一的关系。在这个例子中,我们看到的是`Team`(团队)与`Member`(成员)之间的多对多关系,通过`Map`数据...
总的来说,这个“hibernate 多对多 映射实例,学生 选课”项目涵盖了Hibernate的多对多关系映射、数据库设计、对象模型构建、事务管理等多个方面,是一个很好的学习和实践Hibernate的实战案例。通过深入理解和实践这...
在某些情况下,本地SQL查询的性能可能会优于HQL,因为它避免了Hibernate对HQL的解析和转换过程。 要将本地SQL查询的结果封装成对象,我们首先需要定义一个映射文件(.hbm.xml),在这个文件中,我们需要指定查询...
3. **关联映射**:集合映射通常涉及到两个实体之间的关联,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)关系。 4. **集合属性映射**:在实体类中,集合属性需要使用...
添加、删除和查询多对多关系可以通过简单的集合操作实现,因为Hibernate会自动处理中间表的插入和删除: ```java Student student = new Student(); Course course = new Course(); // 添加关系 student....
本实例主要探讨的是Hibernate的高级映射技术,包括单向一对一、单向多对一、单向一对多以及单向多对多这四种关系映射。 首先,我们来理解一下什么是映射。在Hibernate中,映射是将对象模型与关系数据库之间的桥梁,...
在Hibernate中,数组映射是将数据库表的一列或多列数据映射到Java对象的一个数组属性上。数组可以是基本类型数组或对象类型的数组。这种映射方式简化了数据访问,并提高了代码的可读性和可维护性。 ### 配置数组...