- 浏览: 897591 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (498)
- J2EE (52)
- 数据库 (17)
- java基础 (43)
- web技术 (19)
- 程序设计 (6)
- 操作系统 (18)
- IT资讯 (7)
- 我的IT生活 (12)
- 学习笔记 (9)
- Jquery (25)
- JavaScript (18)
- spring (40)
- Hibernate (12)
- Struts (10)
- YUI (2)
- Extjs (22)
- .net (0)
- Eclipse (10)
- 社会主义 (2)
- 服务器 (9)
- CSS (8)
- 网络安全 (16)
- 版本控制 (9)
- PHP (2)
- Oracle (42)
- SQL server (1)
- Mysql (11)
- 项目管理 (3)
- 开发工具使用 (10)
- SQL语句 (7)
- Perl (0)
- Shell (6)
- 漏洞 (4)
- ibatis (5)
- hacker (2)
- SQL注入 (6)
- Hacker工具 (2)
- 入侵和渗透 (7)
- 插件/组件 (2)
- 最爱开源 (5)
- 常用软件 (2)
- DOS (1)
- HTML (2)
- Android (9)
- CMS (1)
- portal (8)
- Linux (7)
- OSGI (1)
- Mina (5)
- maven (2)
- hadoop (7)
- twitter storm (2)
- sap hana (0)
- OAuth (0)
- RESTful (1)
- Nginx (4)
- flex (1)
- Dubbo (1)
- redis (1)
- springMVC (1)
- node.js (1)
- solr (2)
- Flume (1)
- MongoDB (2)
- ElasticSearch (1)
最新评论
-
M_drm:
请问要怎么设置浏览器才不报没权限呢?
用JS在页面调用本地可执行文件的方法(ACTIVEX) -
Alexniver:
官方文档。When importing data into I ...
mysql导入数据过慢 解决方法 -
camelwoo:
我记得 Criteria 可以做连接查询与子查询,也可以做分页 ...
Hibernate总结篇二 -
zhenglongfei:
楼主如果SubKeyName 这个节点不存在,怎么办??怎么用 ...
Java操作注册表 -
yxx676229549:
用log4j 2 了
logback
在问答里和论坛中,经常看到有人问,怎样将使用本地SQL查询出来的结果映射为值对象的问题,这里就Hibernate中提供的方法做个结论。前提,这里没有使用属性的延迟加载技术。
假设有个值对像,如下:
如果查询全部五列记录的话,那么只要
如果只需要查询id,name,age三列记录呢?那么就要新增构造方法了,
然后呢,就可以通过HQL来进行查询。
这个方法通常可以满足需要了,只是如果,只需要查询id,name,phone三列记录的话,还新增构造方法?不行了,会出现构造方法冲突了。有个办法:
但是,这个只适用于存在Person实体的,如果Hibernate中没有进行Person映射的呢,系统中只存在一个JavaBean。
那么Hibernate就会自动将查出来的三列内容组装到VO对象中去,只是代码量有点大,而且名称都需要重新定义为小写的,在Oracle中查出来的列都默认为大写的(不知道其它数据库怎么样)
这个办法就不依赖于构造方法了,只需要定义私有变量,设置getter/setter方法就行了。
不过如果更猛点的,根本就没有JavaBean对象可以填充怎么办,Hibernate可以将查出来的列组装到集合类中去。如Map。
除了这个Transformers还可以将列转化为List。
到此,还可以通过继承Transformers将结果映射为其它对象,不累述了,基本功能够用了。
假设有个值对像,如下:
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将结果映射为其它对象,不累述了,基本功能够用了。
发表评论
-
为什么用IBATIS不用Hibernate及不用JDBC而用IBATIS
2013-11-23 14:28 0为什么用IBATIS不用Hiberna ... -
Hibernate 面试中最常考察的知识点整合(转)
2013-03-29 16:26 792http://jianfulove.iteye.com/blo ... -
关于Hibernate中占位符式的查询
2013-03-28 17:38 1742占位符式的查询 ( 就是采用 ? 替换查询语句中的变量 ) 是 ... -
Hibernate参考文档
2013-03-28 13:29 860Hibernate参考文档 http://www.redsag ... -
Hibernate中的命名查询
2013-01-27 16:04 2468什么是命名查询? Hibernate允许在映射文件中定义字符 ... -
Hibernate总结篇二
2013-01-27 15:43 1641Hibernate总结篇二 一、HQ ... -
spring 监听器 IntrospectorCleanupListener简介
2012-08-02 17:00 1031"在服务器运行过程中,Spring不停的运行的计划任 ... -
hql写的一个取最大值的语句
2011-11-15 00:31 1055hql写的一个取最大值的语句 http://www.itey ... -
Hibernate 参数设置一览表
2011-09-07 13:35 800属性名 用途 hibernate.di ... -
数据持久化Hibernate的标准数据库连接池配置(转)
2011-07-20 11:22 1496转自:http://hi.baidu.com/lanruiji ... -
关于Hibernate获取JDBC连接 直接执行SQL
2011-07-20 11:03 1202今天要做一个显示数据库列表的功能,不想直接用JDBC,呵呵 于 ... -
Hibernate工作原机制
2010-05-13 08:54 1176原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建S ...
相关推荐
15.2.3 Java Persistence中的原生SQL 15.3 过滤集合 15.4 高速缓存查询结果 15.4.1 启用查询结果高速缓存 15.4.2 理解查询高速缓存 15.4.3 什么时候使用查询高速缓存 15.4.4 自然标识符...
10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...
10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...
10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...
1、在Tomcat中快速上手 2、体系结构 3、SessionFactory配置 4、持久化类 ...13、原生SQL查询 14、性能提升 15、工具箱指南 16、示例:父子关系 17、示例:Weblog应用程序 18、示例:不同的映射 19、最佳实践
原生SQL查询 13.1. 创建一个基于SQL的Query 13.2. 别名和属性引用 13.3. 为SQL查询命名 14. 性能提升(Improving performance) 14.1. 理解集合的性能 14.1.1. 分类 14.1.2. Lists, maps 和...
10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...
10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...
10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...
10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...
使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...
11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. Session刷出(flush) 11.11. 传播性持久化...
复杂sql还是采用原生sql比较直观,容易维护。 但是查询返回的是map,映射到具体的dto上就需要做bean拷贝,效率低下且复杂。 采用新方法,加注解,在返回时候直接映射到具体的DTO上,可以自动下划线转驼峰,忽略大小...
但有时候这些 ‘智能’的对象关系映射又显得笨拙,没有直接使用原生sql来的灵活和简单,而且对于一些如:joins,union, nested selects等复杂的操作支持的不友好。JOOQ 既吸取了传统ORM操作数据的简单性和安全性,又...
原生SQL查询 13.1. 创建一个基于SQL的Query 13.2. 别名和属性引用 13.3. 为SQL查询命名 14. 性能提升(Improving performance) 14.1. 理解集合的性能 14.1.1. 分类 14.1.2. Lists, maps 和...
11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. Session刷出(flush) 11.11. 传播性持久化...
10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...
使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象 11.10. Session刷出(flush) 11.11. 传播性持久化...
详细的Hibernate3的帮助文档 前言 ...11.4.4. 使用原生SQL的查询 11.5. 修改持久对象 11.6. 修改脱管(Detached)对象 11.7. 自动状态检测 11.8. 删除持久对象 11.9. 在两个不同数据库间复制对象
10.4.4. 使用原生SQL的查询 10.5. 修改持久对象 10.6. 修改脱管(Detached)对象 10.7. 自动状态检测 10.8. 删除持久对象 10.9. 在两个不同数据库间复制对象 10.10. Session刷出(flush) 10.11. 传播性持久化...