单表查询:

   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. mysql学习笔记--数据库单表查询

    一.查询语句 1.  select [选项] 列名 [from 表名]  [where 条件]  [order by 排序]  [group by 分组]  [having 条件]  [limit 限 ...

  2. TSQL语言基础笔记之单表查询

    db_id()函数 返回对象的id,如果返回的对象为null,则判断不存在 if db_id('testdb') is null --判断数据库是否存在 create database testdb ...

  3. 《SQL Server 2012 T-SQL基础》读书笔记 - 2.单表查询

    Chapter 2 Single-Table Queries GROUP BY之后的阶段的操作对象就是组(可以把一组想象成很多行组成的)了,HAVING负责过滤掉一些组.分组后的COUNT(*)表示每 ...

  4. SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数

    Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下:   ...

  5. SQL学习笔记四(补充-1)之MySQL单表查询

    阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录 ...

  6. Oracle数据库之单表查询

    接着上一篇的分享,今天主要给大家分享的是关于数据中的单表查询,单表查询很基础,也很重要,但是任何一个初学者必须要掌握的姿势,单表查询就是对单个表进行操作,查询我们想要的数据.单表查询里面的内容也是比较 ...

  7. 零基础学习java------37---------mybatis的高级映射(单表查询,多表(一对一,一对多)),逆向工程,Spring(IOC,DI,创建对象,AOP)

    一.  mybatis的高级映射 1  单表,字段不一致 resultType输出映射: 要求查询的字段名(数据库中表格的字段)和对应的java类型的属性名一致,数据可以完成封装映射 如果字段和jav ...

  8. Mysql常用表操作 | 单表查询

    160905 常用表操作 1. mysql -u root -p 回车 输入密码   2. 显示数据库列表 show databases     3. 进入某数据库 use database data ...

  9. 【T-SQL基础】01.单表查询-几道sql查询题

    概述: 本系列[T-SQL基础]主要是针对T-SQL基础的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

  10. python实现简易数据库之二——单表查询和top N实现

    上一篇中,介绍了我们的存储和索引建立过程,这篇将介绍SQL查询.单表查询和TOPN实现. 一.SQL解析 正规的sql解析是用语法分析器,但是我找了好久,只知道可以用YACC.BISON等,sqlit ...

随机推荐

  1. toast components

    toast components https://jossmac.github.io/react-toast-notifications/ https://docs.microsoft.com/en- ...

  2. spring1 注册value与ref的区别

  3. linux下怎么修改grub.cfg

    一.grub2的启动配置文件grub.cfggrub2的启动配置文件grub.cfg是/boot/grub/grub.cfg,而不是以前的memu.lst.如果你是多系统,有Ubuntu和window ...

  4. P3293 [SCOI2016]美味

    题目描述 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1<=i<=n).有 m 位顾客,第 i 位顾客的期望值为 bi,而他的偏好值为 xi .因此,第 ...

  5. selenium基础-打开百度进行搜索

    1. 安装Python 2. 安装selenium 3. 下载谷歌驱动ChromeDriver,放到Python的Scripts目录下 4. 编写代码,如下 # coding: utf-8 from ...

  6. 一千个不用Null的理由

    原文链接:http://www.importnew.com/27378.html 原文出处: xrzs 港真,Null 貌似在哪里都是个头疼的问题,比如 Java 里让人头疼的 NullPointer ...

  7. java 连接mysql增删改查

    1.创建mysql测试表 2.按下图创建3个文件夹与3个类 3.三个类的代码 PersionDao :目录(Data Access Object), 数据访问对象是第一个面向对象的数据库接口 pack ...

  8. # DZY Love Math 系列

    DZY Love Math 系列 [BOZJ3309] DZY Loves Math 顺着套路就能得到:\(Ans = \sum_{T=1}\lfloor \frac{n}{T} \rfloor \l ...

  9. linux内核设计与实现一书阅读整理 之第三章

    chapter 3 进程管理 3.1 进程 进程就是处于执行期的程序. 进程就是正在执行的程序代码的实时结果. 内核调度的对象是线程而并非进程. 在现代操作系统中,进程提供两种虚拟机制: 虚拟处理器 ...

  10. loj2542「PKUWC2018」随机游走

    题目描述 给定一棵 nn 个结点的树,你从点 xx 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 QQ 次询问,每次询问给定一个集合 SS,求如果从 xx 出发一直随机游走,直到点集 SS ...