Hibernate之SQL查询
Hibernate支持使用原生的SQL语句进行查询。使用原生的SQL的好处是:可以利用某些数据库的特性(不同的数据库SQL 语法会有所差异),
将原有的使用JDBC作为持久层技术的应用 ,迁移到使用Hibernate作为持久层技术。
我们知道 使用HQL查询 主要牵涉的是 Query接口,而使用SQL查询 主要牵涉的 是 SQLQuery接口 。
而SQLQuery接口 是 Query接口的子接口。
所以 Query接口中的方法 ,均可以在SQLQuery接口中使用 ,SQLQuery接口还多了如下两个方法:
addEntity(): 将查询到的 记录 与 持久化类实体 关联
addScalar(): 将查询到的 记录的列的值 关联 成 标量值。
据此 SQL查询可以分为 实体查询 和 标量查询
1.标量查询
session.createSQLQuery(String sql) 查询出来的结果表的 一条记录的列的值 封装成 一个 Object[] 数组。
然后使用list()方法,得到存有N个Object[] 数组 的list集合。
如果查询的结果表 的记录只有一个列,那么就不会封装成为Object[]数组,因为没有必要。这时调用list()方法,会得到直接存有记录列值的list集合。
在调用list()方法 ,封装成集合之前 ,可以调用addScalar()方法进行 ,明确返回值类型的处理。例子:
@Test
public void testSQL()
{
String sql = "select t.name, t.age , t.birthday from tb_person as t";
SQLQuery sqlquery= session.createSQLQuery(sql)
.addScalar("name", StandardBasicTypes.STRING)
.addScalar("age", StandardBasicTypes.INTEGER)
.addScalar("birthday", StandardBasicTypes.DATE); //如果在使用addScalar()方法时,没有包含某列,则该列不会出现在Object[]数组中,尽管已经查出了该列
List<Object[]> list = sqlquery.list();
for(int i = 0 ; i < list.size() ; i++)
{
Object[] objArray = list.get(i);
for(int j = 0 ; j < objArray.length ; i++)
{
System.out.println("第"+i+"条记录的列的值:"+ objArray[j]);
}
} }
标量查询中 ,addScalar()方法有两个作用:
指定查询结果包含哪些数据列 -------没有被addScalar()选出的数据列不会包含在最终查询结果中
指定查询结果中数据列的数据类型
2.实体查询
如果查询返回某个数据表的全部数据列(记住:是选出全部数据列,包括通过外键关联存在从表中的属于这条记录的列),且该数据表有对应的持久化类映射,
我们就可以将查询结果转化为实体查询。
单表情况,即一个持久化类的属性 通过一张表来存储。例子:
@Test
public void testSQLEntity()
{
//持久化Person类 有三个属性 name ,age ,bithday
String sql = "select t.* from tb_person as t where t.id = :id "; SQLQuery sqlquery = (SQLQuery) session.createSQLQuery(sql)
.addEntity(Person.class) //将查询的行记录 转化为 类实体对象
.setInteger("id", 99); // sql绑定参数
List<Person> list = sqlquery.list(); //每一条记录封装成 一个Person类的实例对象 ,放在list集合中 for(int i = 0 ; i < list.size() ; i++)
{
Person p = (Person)list.get(i);
System.out.println("第"+i+"个对象的name属性:" + p.getName() );
System.out.println("第"+i+"个对象的age属性:" + p.getAge() );
System.out.println("第"+i+"个对象的bithday属性:" + p.getBirthday() );
}
}
多表关联的情况, 如持久化类有集合类型的属性 ,等映射成多表 。例子:
@Test
public void testSQLEntity()
{
//持久化Person类 有四个属性 name ,age ,bithday , List<House>
String sql = "select p.* , h.* from tb_person as p , tb_house as h where p.id = h.id and p.id = :id "; //tb_person表 与 tb_house通过既是主键又是外键的 tb_house的id关联 SQLQuery sqlquery = (SQLQuery) session.createSQLQuery(sql)
.addEntity(Person.class) //将查询的行记录 的前部分列转化为 Person类实体对象
.addEntity(House.class) //将查询的行记录 转后部分列化为House类实体对象
.setInteger("id", 99); // sql绑定参数
List<Object[]> list = sqlquery.list(); //每一条记录封装成 一个Person类的实例对象和一个House类的实例对象,放在一个Object[]数组中 ,多个Object数组,放在list集合中 }
命名SQL查询:
类似于命名HQL查询
Hibernate之SQL查询的更多相关文章
- Hibernate原生SQL查询多表关联,SQL语句要注意的问题
Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...
- Hibernate应用SQL查询返回实体类型
Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动 ...
- Hibernate通过SQL查询常量时只能返回第一个字符的解决方法
在Hibernate中如果通过 [java] view plaincopy session.createSQLQuery("select '合计' as name from dual&quo ...
- 使用hibernate原生sql查询,结果集全为1的问题解决
问题如下: String sqlTest ="select summary,summaryno from F_Summary"; List<Map<Object, Ob ...
- Hibernate纯sql查询VO对象封装
hibernate 纯sql查询返回结果集(未关联映射)组装VO的问题//须保证别名字段与Vo字段一致 //引号中为vo对象属性需与sql查询返回字段一致.addScalar("chname ...
- Hibernate原生SQL查询
最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...
- 使用HIBERNATE的SQL查询并将结果集自动转换成POJO
在某些场合下,我们可能想使用HIBERNATE的框架提供的SQL查询接口,但是,由于实体没有做映射,HIBERNATE不能把结果集转换成你想要的List<POJO>,本文讨论如何在这种情况 ...
- Hibernate:SQL查询 addScalar()或addEntity()
Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口.该 ...
- 关于hibernate纯sql查询返回结果集的问题(hbm.xml中不写多表关联)
相信用过hibernate的兄弟们都会因为多表复杂查询后,为返回的结果如何组装到一个VO中而烦恼不已.我也不停的为此而烦恼,但是在看了hibernate的transform后,感觉这个方法还挺管用的. ...
随机推荐
- 【洛谷T7153】(考试) 中位数
题目描述 给定 n 个数 a1, a2, ..., an,求这 n 个数两两的差值(共 n(n−1) 2 个)的中位数. 输入格式: 第一行一个正整数 n,表示数的个数. 接下来一行 n 个正整数,分 ...
- [BZOJ1083] [SCOI2005] 繁忙的都市 (kruskal)
Description 城市C是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造.城市C的道路是这样分布的:城市中有n个交叉路口,有些交叉路口之间有道路相连,两个交叉路口 ...
- 如何直接在github上预览html网页效果
http://justcoding.iteye.com/blog/2321552 2.vue 配合vue-resource调用接口,获取数据 https://www.cnblogs.com/fei ...
- Chrome 浏览器各版本下载大全【转载】
随着最近64位版本的 Chrome 浏览器正式版的推出,Chrome 浏览器再次受到广大浏览迷的重点关注,今天我们就整理一下各版本的 Chrome 浏览器 32位及64位的下载地址,方便各位浏览迷选择 ...
- epoll 实现回射服务器
epoll是I/O复用模型中相对epoll和select更高效的实现对套接字管理的函数. epoll有两种模式 LT 和 ET 二者的差异在于 level-trigger 模式下只要某个 socket ...
- PHP基础入门(一)
php现在很火的后台开发语言,它融合了许多其他的语言,所以它的灵活性不用多说.话不多说,我们开始php的学习吧! 整数类型:$变量名=132;浮点类型:$变量名=1.32;字符串类型:$变量名=&qu ...
- AJAX跨域问题解决方法(3)——被调用方解决跨域
被调用方解决跨域是指在HTTP响应头中增加指定的字段,允许调用方调用 可以在两种地方增加1.apache/nginx(HTTP服务器)2.tomcat(应用服务器) 浏览器如何判断跨域?仔细观察可以发 ...
- KeePass使用心得
这几天发现有人说lastpass并不安全,于是发现了KeePass这个软件,其实这个软件很早之前就知道,不过没有使用,下面就说说我找到的关于这个工具的所有总结. KeePass 配合 Firefox ...
- web 直播&礼物赠送------腾讯云(四)
直播项目搁置了将近1年,以为都搁浅了,没想到头头又提起来了,这次直播技术更替为了腾讯云,消息系统没变,采用的依然是融云,新增了礼物赠送功能. 项目完成基本就是这样子: 一,播放器 由阿里云转腾讯云,w ...
- VirboxLM许可管理平台,一站式软件保护解决方案
安全,易用,灵活 轻松解决开发者软件版权保护难题 Virbox LM为企业提供安全易用的软件保护管理平台,实现高安全强度的软件防护,防止盗版及逆向工程.实现便捷.安全的软件授权,包括创建灵活的许可模式 ...