单表查询:

   Hibernate是DAO层技术,对数据的使用,查询是最为重要的。Hibernate的查询技术非常强大,支持原始SQL语句查询,支持QBC查询及Hibernate特有的HQL查询。
   HQL,Hibernate Query Language,Hibernate查询语言,它与SQL非常相似。但,HQL是面向对象的查询语言,而SQL是面向二维表的。HQL查询语句中使用的是类名与属性名,而SQL语句使用的是表名与字段名。
   QBC,Query By Criteria,标准查询,一种比HQL更为面向对象的查询方法。

  对应API:

    (1) Query接口:

      Hibernate进行HQL查询的接口,支持动态绑定参数的功能。使用Session对象的createQuery方法可获取Query对象。 
      Query query = session.createQuery(hql);

    (2)SQLQuery接口:

      Hibernate进行SQL原生查询的接口,支持动态绑定参数的功能,是Query接口的子接口。使用Session对象的createSQLQuery()方法可获取SQLQuery对象。 
      SQLQuery sqlQuery = session.createSQLQuery(sql);
      其查询出的结果对象默认为Object,当然,若结果为List,则其元素为Object。使用SQLQuery的addEntity(Xxx.class)方法,可以将其结果泛型设定为指定类型。

    (3) Criteria接口:

      Criteria,标准、准则,Hibernate进行Criteria查询的接口,与Query接口无关。使用Session对象的createCriteria()方法可获取Criteria对象。 
      Criteria criteria = session.createCriteria(Xxx.class);

  具体查询代码:

    (1) 查询所有:

 //查询所有
@Test
public void test01_SQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String sql = "select tid,tname,tage,tscore from t_student";
List<Student> list = session.createSQLQuery(sql).addEntity(Student.class).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test01_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
//sql中出现的是表名与字段名,hql中出现的是类名与属性名
String hql = "from Student";
List<Student> list = session.createQuery(hql).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test01_QBC() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
List<Student> list = session.createCriteria(Student.class).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

    (2)对查询结果排序:

 //查询结果查询
@Test
public void test02_SQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String sql = "select tid,tname,tage,tscore from t_student order by tage desc";
List<Student> list = session.createSQLQuery(sql).addEntity(Student.class).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test02_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student order by age desc";
List<Student> list = session.createQuery(hql).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test02_QBC() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
List<Student> list = session.createCriteria(Student.class).addOrder(Order.desc("age")).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

    (3) 动态参数绑定查询:

 //动态参数绑定查询
@Test
public void test03_1() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where age > ? and score < ?";
List<Student> list = session.createQuery(hql)
.setInteger(0, 20)
.setDouble(1, 94)
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test03_2() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where age > :myage and score < :myscore";
List<Student> list = session.createQuery(hql)
.setInteger("myage", 20)
.setDouble("myscore", 94)
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test03_3() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where age > ? and score < ?";
List<Student> list = session.createSQLQuery(hql)
.setParameter(0, 20)
.setParameter(1, 94.0) //这里必须是94.0
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test03_4() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where age > :myage and score < :myscore";
List<Student> list = session.createQuery(hql)
.setParameter("myage", 20)
.setParameter("myscore", 94.0) //这里必须是94.0
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

    (4) 分页查询:

//分页查询
@Test
public void test04_SQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String sql = "select * from t_student limit ?,?";
List<Student> list = session.createSQLQuery(sql)
.addEntity(Student.class)
.setInteger(0, 4)
.setInteger(1, 3)
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
} @Test
public void test04_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student";
List<Student> list = session.createQuery(hql)
.setFirstResult(4)
.setMaxResults(3)
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

    (5) 模糊查询:

 //模糊查询
@Test
public void test05_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where name like :myname";
List<Student> list = session.createQuery(hql)
.setString("myname", "%n%")
.list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

    (6) 唯一性查询:

 //唯一性查询
@Test
public void test06_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student where id=:myid";
Student student = (Student) session.createQuery(hql)
.setInteger("myid", 3)
.uniqueResult();
System.out.println(student);
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

    (7) 聚合函数查询:

 //聚合函数查询
@Test
public void test07_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "select count(id) from Student";
Long count = (Long) session.createQuery(hql).uniqueResult();
System.out.println(count);
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

    (8) 投影查询:

 //投影查询
@Test
public void test08_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "select new Student(name, age) from Student";
List<Student> list = session.createQuery(hql).list();
for (Student student : list) {
System.out.println(student);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

    (9) 分组查询:

 //分组查询
@Test
public void test09_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
String hql = "from Student group by age";
List<Integer> list = session.createQuery(hql).list(); //每个年龄段的第一个人
System.out.println(list); String hql2 = "select age from Student group by age";
List<Integer> list2 = session.createQuery(hql2).list(); //共有几个年龄段
System.out.println(list2); String hql3 = "select age from Student group by age having count(age) > 1";
List<Integer> list3 = session.createQuery(hql3).list(); //人数多于1人的年龄段
System.out.println(list3);
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

    (10) iterator和N+1问题的解决:

 @Test
public void test10_3() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
//第一次查询
String hql = "from Student";
List<Student> list = session.createQuery(hql).list();
for (Student student : list) {
System.out.println(student);
}
//第二次查询
String hql2 = "from Student";
Iterator<Student> it2 = session.createQuery(hql2).iterate();
while (it2.hasNext()) {
Student student2 = it2.next();
System.out.println(student2);
}
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

      解释:list()方法对所有Student表的每条数据进行一次详情查询,但是第二次再用list()查询时不会从Session缓存中读取数据;

         而iterator()方法首先对Student表的主键进行查询(对主键的查询比详情效率高,因为数据库中存在索引),再根据主键依次对Student表中的每条数据进行逐个查询,总共查询了N+1次,但是第二次再用iterator()查询时,只会做主键查询,然后根据主键从Session缓存中读取数据,而不会进行详情查询。

         所以,如果要进行多次查询时,第一次使用list()查询,之后每次都使用iterator()查询。

    (11) 命名查询(好处:可以在配置文件中修改查询语句):

 //命名查询
@Test
public void test11_HQL() {
//1. 获取Session
Session session = HbnUtils.getSession();
try {
//2. 开启事务
session.beginTransaction();
//3. 操作
Student student = (Student) session.getNamedQuery("selectById")
.setInteger("myid", 3)
.uniqueResult();
System.out.println(student);
//4. 事务提交
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//5. 事务回滚
session.getTransaction().rollback();
}
}

    对应映射文件为:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<!-- 类到表的映射,属性到字段的映射 -->
<class name="com.tongji.beans.Student" table="t_student">
<id name="id" column="tid">
<generator class="native"/>
</id>
<property name="name" column="tname"/>
<property name="age" column="tage"/>
<property name="score" column="tscore"/>
</class>
<query name="selectById">from Student where id=:myid</query>
</hibernate-mapping>

Hibernate5-课程笔记4的更多相关文章

  1. Linux内核分析课程笔记(一)

    linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...

  2. (1/18)重学Standford_iOS7开发_iOS概述_课程笔记

    写在前面:上次学习课程对iOS还是一知半解,由于缺乏实践,看公开课的视频有时不能很好地领会知识.带着问题去学习永远是最好的方法,接触一段时间iOS开发以后再来看斯坦福iOS公开课,又会有许多新的发现, ...

  3. Andrew Ng机器学习课程笔记(五)之应用机器学习的建议

    Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...

  4. Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)

    title: Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归) tags: 机器学习, 学习笔记 grammar_cjkRuby: true --- 之前看过一遍,但是总是模 ...

  5. Andrew Ng机器学习课程笔记--汇总

    笔记总结,各章节主要内容已总结在标题之中 Andrew Ng机器学习课程笔记–week1(机器学习简介&线性回归模型) Andrew Ng机器学习课程笔记--week2(多元线性回归& ...

  6. Andrew 机器学习课程笔记

    Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...

  7. 操作系统学习笔记----进程/线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  8. 《CSS动画实用技巧》课程笔记

    概述 这是我学习[CSS动画实用技巧][1]的课程笔记 常用动画属性--transition [常用动画属性--transition][2] .change img{ display:block; w ...

  9. Deeplearning.ai课程笔记--汇总

    从接触机器学习就了解到Andrew Ng的机器学习课程,后来发现又出来深度学习课程,就开始在网易云课堂上学习deeplearning.ai的课程,Andrew 的课真是的把深入浅出.当然学习这些课程还 ...

  10. selenium课程笔记

    selenium课程笔记第一天(2017-7-1) 一.配置火狐浏览器 运行:firefox.exe -p -no -remote selenium课程笔记第二天 用Eclipse+java+sele ...

随机推荐

  1. C#程序调用cmd.exe执行命令

    代码部分 using System.Diagnostics; public class CmdHelper { private static string CmdPath = @"C:\Wi ...

  2. CSS居中方法搜集

    转自这里:http://jinlong.github.io/blog/2013/08/13/centering-all-the-directions/ 兼容低版本IE的方法 html使用表格结构 背景 ...

  3. js 冒泡 捕获

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> ...

  4. C#利用Emit反射实现AOP,以及平台化框架封装思路

    C#利用Emit反射实现AOP,以及平台化框架封装思路 这是前两天扒的一段动态代理AOP代码,用的Emit反射生成子类来实现代理模式,在这里做个小笔记,然后讨论一下AOP框架的实现思路. 首先是主函数 ...

  5. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(下)

    <Troubleshooting SQL Server>读书笔记-CPU使用率过高(下) 第三章 High CPU Utilization. CPU使用率过高的常见原因 查询优化器会尽量从 ...

  6. Ajax实现天气预报功能

    实现天气预报功能 闲来无聊,写下此文 经常看见很多网站上有那种天气预报功能,自己之前也写过一个,不过属于那种涉及WCF服务引用那种,今天发现一个更为简单的方式来实现,使用Javascript和Ajax ...

  7. vmstat命令查看系统资源占用情况

    vmstat是一个十分有用的Linux系统监控工具,使用vmstat命令可以得到关于进程.内存.内存分页.堵塞IO.traps及CPU活动的信息.可用以下命令查看: # vmstat 2 直接查看系统 ...

  8. MS Sql Server 消除重复行 保留信息完整的一条 2011-11-26 13:19(QQ空间)

    select company ,count(company) as coun into myls from mylist group by company having count(company)& ...

  9. JBPM之JPdl小叙

    JPdl:jbpm流程定义文件,下面是一个简单的流程定义文件: <?xml version="1.0" encoding="UTF-8"?> < ...

  10. 你不知道的Eclipse用法:使用Allocation tracker跟踪Android应用内存分配

    Android Tools中的DDMS带有一个很不错的跟踪内存分配的工具Allocation tracker.通过Alloction tracker,不仅知道分配了哪类对象,还可以知道在哪个线程.哪个 ...