一.Hibernate检索方式概述

  1. OID检索方式:按照对象的OID来检索对象(get/load)
  2. HQL检索方式:使用面向对象的HQL查询语言
  3. QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种api封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口(功能较弱)
  4. 本地SQL检索方式:使用本地数据库的SQL查询语句。

二.Hibernate检索策略

Hibernate提供了多种查询检索方式,每种方式查询数据的方式与时间段都不同,

Hibernate提供了延迟加载(load)、立即加载(get)两种检索策略。

延迟加载(懒加载):延迟加载检索方法指定的对象,也就是查询的时候并不是马上去查询并加载持久化对象,而是在调用持久化对象的方法时再去加载。

立即加载:立即加载检索方法指定的对象。

->使用load方法获取对象,默认是延迟加载的,通过观察sql语句执行的位置可以看出,检索持久化对象时并不查询数据库,而当调用持久化对象的方法时才去查询数据库,这种策略就叫延迟加载。使用get方法获取持久化对象,会马上执行sql语句,这种策略叫立即加载。

public class Demo {
@Test
public void test(){
Configuration cfg = new Configuration().configure();
SessionFactory sf = cfg.buildSessionFactory();
Session session = sf.openSession();
Transaction ts = session.beginTransaction(); Dept dept = (Dept)session.load(Dept.class, 1);
System.out.println("此时不查询数据库");
System.out.println(dept.getDname()); ts.commit();
session.close();
sf.close();
} }

使用load方法时,返回的是一个代理对象,该代理对象的特点:

1 .是持久化类的子类对象。

2 .包含持久化类的全部属性以及属性的get/set函数。

3. 对get函数进行了覆盖:原理如下

public String getName() {

this.name = queryFromDb();//数据库查询

return this.name;

}

4.Hibernate使用javassist-3.9.0.GA.jar包创建代理

类级别检索策略: session的方法直接检索持久化对象,hibernate加载该持久化对象的策略。

关联级别检索策略:查询持久化对象的关联对象的加载策略。

三.关联级别检索策略(一对多,多对多检索策略)

lazy属性:是否延迟加载,

true :延迟加载  (默认):查询持久化对象,使用相关联对象时再去查询

false:即时加载  :查询持久化对象时会查询出所有与持久化对象相关联的对象

一般情况下都要设置Lazy=true, 这样可以少查无用的数据, 提高性能. 但是有的时候需要一次性把关联的数据都查出来, 这个时候就需要使用积极加载去避免lazy loading了. 具体情况具体分析。

* 类级别的检索:<class>标签上配置lazy

* 关联级别的检索: <set>/<many-to-one>上面的lazy。

注意:无论 <class> 元素的 lazy 属性是 true 还是 false, Session get() 方法在类级别总是使用立即检索策略

比较检索策略

四.HQL检索方式

1>HQL(Hibernate Query Language) 是面向对象的查询语言,确切的说他是以脚本的方式查询对象的语言。 它和SQL查询语言有些相似. 在Hibernate提供的各种检索方式中, HQ是使用最广的一种检索方式. 它有如下功能:

2>在查询语句中设定各种查询条件

支持投影查询,即仅检索出对象的部分属性;

支持分页查询;

支持连接查询;

支持分组查询,允许使用having和group by关键字

提供内置聚集函数,如sum(),min(),max();

能够调用用户定义的SQL函数或标准的SQL函数;

支持子查询;

支持动态绑定参数;

/**
* Created by jiatp
*/
public class HqlTest {
//1.基本查询
@Test
public void test1(){
Session session = HibernateUtils.openSession();
Transaction ts = session.beginTransaction();
//查询所有部门信息
String hql = "from Dept";
Query query = session.createQuery(hql);
List<Dept> list = query.list();
for(Dept dept:list) {
System.out.println(dept.getDname());
System.out.println(dept.getEmps().size());
}
ts.commit();
session.close(); }
//2.条件查询 1.占位符 2.参数命名
@Test
public void test2(){
Session session = HibernateUtils.openSession();
Transaction ts = session.beginTransaction();
//查询所有部门信息
String hql1 = "from Dept where did=?";
String hql2 = "from Dept where did=:did";
Query query1 = session.createQuery(hql1);
Query query2 = session.createQuery(hql2);
//占位符赋值
query1.setInteger(0,1);
//参数命名赋值
query2.setInteger("did",1);
//查询
Dept dept1 = (Dept)query1.uniqueResult();
Dept dept2 = (Dept)query2.uniqueResult();
System.out.println(dept1.getDname());
System.out.println(dept2.getDname());
ts.commit();
session.close(); }
//3.分页查询
@Test
public void test3(){
Session session = HibernateUtils.openSession();
Transaction ts = session.beginTransaction();
//查询所有部门信息
String hql = "from Dept where dname like ?";
Query query = session.createQuery(hql);
query.setParameter(0,"%发%"); //变量用+连接"+"+ 变量+"%"
//分页
query.setFirstResult(0);
query.setMaxResults(3);
List<Dept> list = query.list();
for(Dept dept: list) {
System.out.println(dept.getDid()+"==="+dept.getDname());
}
ts.commit();
session.close(); }
//4.投影查询 返回一个数组
@Test
public void test5(){
Session session = HibernateUtils.openSession();
Transaction ts = session.beginTransaction();
//查询所有部门信息
String hql1 = "select did,dname from Dept";//返回对象数组
Query query = session.createQuery(hql1);
List<Object[]> list = query.list();
for(int i=0;i<list.size();i++) {
Object[] object = list.get(i);
System.out.println(object[0]+"===="+object[1]);
}
String hql2 = "select dt from Dept dt"; //返回集合对象
Query query1 = session.createQuery(hql2);
List<Dept> list1 = query1.list();
for(Dept dept:list1) {
System.out.println(dept.getDid()+"=="+dept.getDname());
} //Dept类中要提供构造方法
String hql3 = "select new Dept(did,dname) from Dept";
Query query2 = session.createQuery(hql3);
List<Dept> list2 = query2.list();
for(Dept dept:list2) {
System.out.println(dept.getDid()+"=="+dept.getDname());
}
ts.commit();
session.close();
}
// 5.排序
@Test
public void test6(){
Session session = HibernateUtils.openSession();
Transaction ts = session.beginTransaction();
String hql = "select dt from Dept d t order by dt.did desc";
Query query = session.createQuery(hql);
List<Dept> list = query.list();
for(Dept dept:list) {
System.out.println(dept.getDid()+"=="+dept.getDname());
}
ts.commit();
session.close();
}
//6.查询聚合函数
@Test
public void test7(){
Session session = HibernateUtils.openSession();
Transaction ts = session.beginTransaction();
String hql1 = "select COUNT (*) FROM Dept";
String hql2 = "select sum (did) FROM Dept";
String hql3 = "select avg (did) FROM Dept";
String hql4 = "select max (did) FROM Dept";
String hql5 = "select min (dit) FROM Dept";
Query query = session.createQuery(hql1);
Number i =(Number) query.uniqueResult();
System.out.println(i);
ts.commit();
session.close();
}
//7.增加一个部门 广告部
@Test
public void test8(){
Session session = HibernateUtils.openSession();
Transaction ts = session.beginTransaction();
Dept dept = new Dept();
dept.setDname("广告部");
session.save(dept);
ts.commit();
session.close(); } //8.删除
@Test
public void test9(){
Session session = HibernateUtils.openSession();
Transaction ts = session.beginTransaction();
String hql = "delete from Dept dt where dt.did=? ";
Query query = session.createQuery(hql);
query.setParameter(0,7);
query.executeUpdate();
ts.commit();
session.close(); }
//外联(左外联,右外联)/迫切
//内联,
@Test
public void test8() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
String hql="from Dept d inner join d.emps";
Query query = session.createQuery(hql);
List list = query.list();
for(int i=0;i<list.size();i++){
Object[] obj = (Object[]) list.get(i);
System.out.println(((Dept)obj[0]).getDname()+"===="+((Emp)obj[1]).getEname());
}
//************************************
tx.commit();
session.close();
}
//内联,/迫切
@Test
public void test9() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//*****************************************
String hql="from Dept d inner join fetch d.emps";
Query query = session.createQuery(hql);
List<Dept> list = query.list();
//创建集合保存部门名称
List<String> lstr = new ArrayList<String>();
for (Dept dept : list) {
Set<Emp> emps = dept.getEmps();
Iterator<Emp> it = emps.iterator();
while(it.hasNext()){
Emp emp = it.next();
if(lstr.contains(emp.getDept().getDname())){
continue;
}else{
System.out.println(dept.getDname()+"==="+emp.getEname());
}
}
//处理重复部门名
lstr.add(dept.getDname());
}
//****************************************
tx.commit();
session.close();
}
//左外联
@Test
public void test10() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
String hql="from Dept d left join d.emps";
Query query = session.createQuery(hql);
List list = query.list();
for(int i=0;i<list.size();i++){
Object[] obj = (Object[]) list.get(i);
if(obj!=null){
System.out.print(((Dept)obj[0]).getDname());
if(((Emp)obj[1])!=null){
System.out.print("\t"+((Emp)obj[1]).getEname());
}
System.out.println();
}
} //************************************
tx.commit();
session.close();
}
//右外联,
@Test
public void test11() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
String hql="from Dept d right join d.emps";
Query query = session.createQuery(hql);
List list = query.list();
for(int i=0;i<list.size();i++){
Object[] obj = (Object[]) list.get(i);
if(obj!=null){
if(((Dept)obj[0])!=null){
System.out.print(((Dept)obj[0]).getDname());
}
if(((Emp)obj[1])!=null){
System.out.print("\t"+((Emp)obj[1]).getEname());
}
System.out.println();
}
} //************************************
tx.commit();
session.close();
}
//左外联,/迫切
@Test
public void test12() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
String hql="from Dept d left join fetch d.emps";
Query query = session.createQuery(hql);
List<Dept> list = query.list();
for(Dept dept : list){
Set<Emp> emps = dept.getEmps();
Iterator<Emp> it = emps.iterator();
//
if(dept.getDname()!=null){
System.out.print(dept.getDname());
}
while(it.hasNext()){
Emp emp = it.next();
if(emp.getDept().getDname()!=dept.getDname()){
System.out.print(dept.getDname());
}
if(emp.getEname()!=null){
System.out.print("\t"+emp.getEname());
}
System.out.println();
}
} //************************************
tx.commit();
session.close();
}
//分组
@Test
public void test13(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
//查询部门中的员工的人数
String hql ="select count(*),e.dept.dname from Emp e group by e.dept.dname";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for(int i = 0 ;i<list.size();i++){
Object[] o = list.get(i);
System.out.println(o[0]+"====="+o[1]);
}
//************************************
tx.commit();
session.close();
}
}

五.QBC检索方式

QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。

public class TestQbc {

	//简单的查询  (无sql)
@Test
public void test() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
//查询所有部门信息
Criteria criteria = session.createCriteria(Dept.class);
List<Dept> list = criteria.list();
System.out.println(list);
//************************************
tx.commit();
session.close();
}
//按条件查询
//== eq
//>= ge
//> gt
//<= le
//< lt
//<> != ne
//in in
//between between
//like like
//is null isNull
//is not null isNotNull
//and and
//or or
@Test
public void test1() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
//查询did=2 部门名称
Criteria criteria = session.createCriteria(Dept.class);
criteria.add(Restrictions.eq("did", 2));
Dept dept = (Dept) criteria.uniqueResult(); System.out.println(dept.getDname());
//************************************
tx.commit();
session.close();
}
//分页
@Test
public void test2() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
//limit 0,3
Criteria criteria = session.createCriteria(Dept.class);//.setFirstResult(0).setMaxResults(3).list();
criteria.setFirstResult(0); //起始值
criteria.setMaxResults(3); //条数
List<Dept> list = criteria.list();
System.out.println(list);
//************************************
tx.commit();
session.close();
}
//查询总记录数
@Test
public void test3() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
//limit 0,3
Criteria criteria = session.createCriteria(Dept.class);
criteria.setProjection(Projections.rowCount());
Long iter = (Long) criteria.uniqueResult();
System.out.println(iter);
//************************************
tx.commit();
session.close();
} }

Criteria:限制符

六.本地SQL检索方式

public class TestSql {

	//简单部门信息
@Test
public void test1() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
String sql="select dname,ename from Dept d,emp e where d.did=e.deptid";
SQLQuery sqlquery = session.createSQLQuery(sql);
List list = sqlquery.list();
for(int i=0;i<list.size();i++){
Object[] obj = (Object[]) list.get(i);
System.out.println(obj[0]+"===="+obj[1]);
}
//************************************
tx.commit();
session.close();
}
//条件
@Test
public void test2() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
String sql="select * from Dept where dname like ?";
SQLQuery sqlquery = session.createSQLQuery(sql);
sqlquery.setParameter(0, "%发%");
//返回实体
sqlquery.addEntity(Dept.class);
List<Dept> list = sqlquery.list();
for (Dept dept : list) {
System.out.println(dept.getDname());
}
//************************************
tx.commit();
session.close();
}
//分页
@Test
public void test3() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//************************************
String sql="select * from Dept limit ?,?"; //hql语句:count(*)
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setParameter(0, 0);
sqlQuery.setParameter(1, 2);
sqlQuery.addEntity(Dept.class);
List<Dept> list = sqlQuery.list();
for(Dept dept : list){
System.out.println(dept.getDname());
}
//************************************
tx.commit();
session.close();
}
}

HQL和QBC比较:

04_Hibernate检索方式的更多相关文章

  1. Hibernate —— HQL、QBC检索方式

    一.HQL 检索方式 以双向的一对多来测试 HQL 检索方式.以 Department 和 Employee 为例. 建表语句: CREATE TABLE department ( dept_id ) ...

  2. Hibernate的检索方式

    Hibernate的检索方式 检索方式(查询的方式) 导航对象图检索方式: 根据已经加载的对象导航到其他对象 Customer customer = (Customer)session.get(Cus ...

  3. 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)

    本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...

  4. 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)

    Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...

  5. hibernate检索方式(HQL 检索方式,QBC 检索方式,本地 SQL 检索方式)

    hibernate有五种检索方式,这儿用 单向的一对多的映射关系 例子,这儿有后三种的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 ...

  6. Hibernate 检索方式

    概述 •Hibernate 提供了以下几种检索对象的方式 –导航对象图检索方式:  根据已经加载的对象导航到其他对象 –OID 检索方式:  按照对象的 OID 来检索对象 –HQL 检索方式: 使用 ...

  7. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  8. [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. Hibernate的三种常用检索方式

    Hibernate 提供了以下几种检索对象的方式 ¨       导航对象图检索方式:  根据已经加载的对象导航到其他对象 ¨       OID 检索方式:  按照对象的 OID 来检索对象 ¨   ...

随机推荐

  1. 使用雪碧图Css Sprite精灵 | 加速网页响应速度

    什么是CSS Sprite精灵? 是用于前端的一种图片应用技术,通常情况,我们的开发的网页或许有很多张图片,假如在一个页面上有50多张小图片,这意味着浏览器要逐个下载50张图片.Css Sprite它 ...

  2. python opencv3 写字画圈画矩形

    python opencv练习 自定义一张[512, 512, 3]的图像 在上面写写字,画画圈和矩形 显示 代码为: import cv2 import numpy as np img = np.z ...

  3. BBS论坛 项目表分析

    一.项目表分析 from django.db import models from django.contrib.auth.models import AbstractUser # Create yo ...

  4. Ubuntu18.04 安装搜狗拼音

    参考文章:https://blog.csdn.net/fx_yzjy101/article/details/80243710 1. 安装fcitx sudo apt-get install fcitx ...

  5. Vagrant安装步骤

    Vagrant安装步骤 下载添加box镜像 vagrant box add base 远端的box地址或者本地的box文件名 建立box镜像关联 vagrant box add centos72 va ...

  6. K8S之部署Dashboard

    转载声明 本文转载自:ASP.NET Core on K8S深入学习(2)部署过程解析与部署Dashboard 1.Yaml安装 下载yaml文件 wget https://raw.githubuse ...

  7. yii2 vendor/bower/jquery/dist not exist

    查看 vendor 文件夹,只有bower-asset文件夹 手动修改 bower-asset 为bower 倒也可以,yii2项目每次 composer install 成功之后,每次重命名这个文件 ...

  8. thinkphp 页面Trace信息

    调试模式并不能完全满足我们调试的需要,有时候我们需要手动的输出一些调试信息.除了本身可以借助一些开发工具进行调试外,ThinkPHP还提供了一些内置的调试工具和函数.例如,页面Trace功能就是Thi ...

  9. 2018湖南NOIP集训报告7.15~7.26

    Day1 主打内容:dfs/bfs及其优化剪枝,以及贪心算法的应用. 老师:\(Gromah\) 不得不说这个老师真的是个有趣的强大怪... 今天讲的挺水的,其实就是搜索吧,也没啥好听的,追会儿小说\ ...

  10. IE6/IE7尿性笔记 && avalon && director

    表单提交 [ie6] form默认特性(input回车以及点击type=submit的按钮会自动触发form submit),在ie6中,不能使button[submit],必须是input[subm ...