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查询

最新文章

  1. tornado学习笔记18 _RequestDispatcher 请求分发器
  2. Pycharm用Ctrl+鼠标滚轮调节代码字体大小
  3. Silverlight类百度文库在线文档阅读器
  4. Python mysql sqlite 数据没有更新
  5. XAF进修二:在XAF中打开自定义的WinForm
  6. pycharm使用错误排查
  7. Windows Server 2012学习文档
  8. 协定类型不具有 ServiceContractAttribute 特性
  9. poj3233之经典矩阵乘法
  10. Appium的iOS环境搭建
  11. read()和write()
  12. matlab中特殊符号如希腊字符
  13. Shell按行读取文件的3种方法
  14. mysql获取随机字符串和随机数的方法
  15. BZOJ3149 CTSC2013 复原 搜索
  16. 20170728 Celery项目 后台处理SQL SERVER的一个异常
  17. sql server转oracle需要注意的几点
  18. hadoop 启动的时候datanode报错 Problem connecting to server
  19. 连接数据库及出现System.AccessViolationException错误的解决方法
  20. 解决hue报错:timed out (code THRIFTSOCKET): None

热门文章

  1. [ZJOI2006]书架(树状数组水过)
  2. Listener监听器生命周期
  3. IDEA 使用tomcat7-maven-plugin
  4. 利用EF Core的Join进行多表查询
  5. 2018 年 3 月 iOS架构师 面试总结
  6. C# 中的关键字整理
  7. Python 3 中生成器函数yield表达式的使用
  8. ASP.NET MVC编程——模型
  9. python 对模块的应用你还得练点这些
  10. 【Python】 多线程并发threading &amp; 任务队列Queue