• QBC检索

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

1)通过Critera实现具有条件的查询

     @Test
public void testCriteria00() {
// 1、创建criteria对象
Criteria criteria = session.createCriteria(Employee.class); // 2、添加过滤条件可以用Criterion表,Criterion可以通过Restrictions的静态方法返回。
criteria.add(Restrictions.eq("email", "tommy10@dx.com"));
criteria.add(Restrictions.gt("salary", 1000F)); System.out.println(criteria.uniqueResult());
}

执行sql及结果:

Hibernate:
select
this_.ID as ID1_1_0_,
this_.NAME as NAME2_1_0_,
this_.SALARY as SALARY3_1_0_,
this_.EMAIL as EMAIL4_1_0_,
this_.DEPARTMENT_ID as DEPARTME5_1_0_
from
DX_EMPLOYEE this_
where
this_.EMAIL=?
and this_.SALARY>?
Employee [id=11, name=tommy10, salary=10000.0, email=tommy10@dx.com]

2)通过Critera实现具有AND OR条件的查询

 @Test
public void testCriteraAndOr() {
Criteria criteria = session.createCriteria(Employee.class); // AND :使用Conjunction表示,Conjunction本身就是一个Criterion对象,且其中还可以添加Criterion对象
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(Restrictions.like("name", "2", MatchMode.ANYWHERE));
Department depart = new Department();
depart.setId(5);
conjunction.add(Restrictions.eq("department", depart)); // OR
Disjunction disjunction = Restrictions.disjunction();
disjunction.add(Restrictions.gt("salary", 10000F));
disjunction.add(Restrictions.isNull("email")); criteria.add(disjunction);
criteria.add(conjunction); List<Employee> items = (List<Employee>) criteria.list();
System.out.println(items.size());
}

执行sql及结果:

 Hibernate:
select
this_.ID as ID1_1_0_,
this_.NAME as NAME2_1_0_,
this_.SALARY as SALARY3_1_0_,
this_.EMAIL as EMAIL4_1_0_,
this_.DEPARTMENT_ID as DEPARTME5_1_0_
from
DX_EMPLOYEE this_
where
(
this_.SALARY>?
or this_.EMAIL is null
)
and (
this_.NAME like ?
and this_.DEPARTMENT_ID=?
)
2

3)通过Critera实现统计查询:使用Projection 来表示

     @Test
public void testStatistics(){
Criteria criteria=session.createCriteria(Employee.class); // 统计查询:使用Projection 来表示
criteria.setProjection(Projections.max("salary")); System.out.println(criteria.uniqueResult());
}

执行sql及结果:

 Hibernate:
select
max(this_.SALARY) as y0_
from
DX_EMPLOYEE this_
79000.0

4)通过Critera实现排序、分页查询

     @Test
public void testOrderByAndPager() {
Criteria criteria = session.createCriteria(Employee.class); // 1) Order By
criteria.addOrder(Order.desc("salary"));
criteria.addOrder(Order.desc("name")); // 2) Pager
int pageSize = 5;
int pageNum = 2;
List<Employee> employees = (List<Employee>) criteria.setFirstResult((pageNum - 1) * pageSize).setMaxResults(pageSize).list(); System.out.println(employees.size());
}

执行sql及结果:

 Hibernate:
select
this_.ID as ID1_1_0_,
this_.NAME as NAME2_1_0_,
this_.SALARY as SALARY3_1_0_,
this_.EMAIL as EMAIL4_1_0_,
this_.DEPARTMENT_ID as DEPARTME5_1_0_
from
DX_EMPLOYEE this_
order by
this_.SALARY desc,
this_.NAME desc limit ?,
?
5

更多关于QBC的使用方式需要参考Hibernate官网实例。

  • 本地SQL查询

本地SQL查询来完善HQL不能涵盖所有的查询特性。

     @Test
public void testNativeSqlInsert() {
String sql = "insert into dx_department(id,name)values(?,?);"; Query query = session.createSQLQuery(sql); query.setInteger(0, 7).setString(1, "移动部门").executeUpdate(); Department departs = session.get(Department.class, 7);
System.out.println(departs);
}

执行sql及结果:

 Hibernate:
insert
into
dx_department
(id,name)
values
(?,?);
Hibernate:
select
department0_.ID as ID1_0_0_,
department0_.NAME as NAME2_0_0_
from
DX_DEPARTMENT department0_
where
department0_.ID=?
Department [id=7, name=移动部门]
  • HQL删除操作:
     @Test
public void testDeleteWithHQL() {
String hql = "DELETE FROM Department d WHERE d.id=:id";
session.createQuery(hql).setInteger("id", 7).executeUpdate();
}

执行sql及结果:

 Hibernate:
delete
from
DX_DEPARTMENT
where
ID=?

Hibernate(十五):QBC检索、本地SQL检索和HQL删除的更多相关文章

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

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

  2. Hibernate 检索查询的几种方式(HQL,QBC,本地SQL,集成Spring等)

    1.非集成Spring hibernate的检索方式,主要有以下五种. 1.导航对象图检索方式.(根据已经加载的对象,导航到其他对象.) 2.OID检索方式.(按照对象的OID来检索对象.) 3.HQ ...

  3. [原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页

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

  4. QBC检索和本地SQL检索

    细说QBC:QBC(Query By Criteria) 查询:这种方式比较面向对象方式,因为是面向对象,所以查询时参数名就是所查询的类的属性名并不是数据库的表的列名重点是有三个描述条件的对象:Res ...

  5. Hibernate之QBC检索和本地SQL检索

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

  6. 二十五、oracle pl/sql进阶--控制结构(分支,循环,控制)

    一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...

  7. Hibernate(十五)注解

    一.Hibernate注解 使用注解的方式来注释类和属性,从而完成对象和关系的映射 二.步骤 三.注解标签 四.查询

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

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

  9. Hibernate检索策略与检索方式

    hibernate的Session在加载Java对象时,一般都会把鱼这个对象相关联的其他Java对象也都加载到缓存中,以方便程序的调用.但很多情况下,我们不需要加载太多无用的对象到缓存中,一来会占用大 ...

随机推荐

  1. 剑指Offer-孩子们的游戏(圆圈中最后剩下的数)

    package Other; import java.util.LinkedList; /** * 孩子们的游戏(圆圈中最后剩下的数) * 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友, ...

  2. 二分查找(binary search)java实现及时间复杂度

    概述 在一个已排序的数组seq中,使用二分查找v,假如这个数组的范围是[low...high],我们要的v就在这个范围里.查找的方法是拿low到high的正中间的值,我们假设是m,来跟v相比,如果m& ...

  3. docker教程

    Docker 包括三个基本概念 镜像(Image) 容器(Container) 仏库(Repository) 理解了返三个概念,就理解了 Docker 的整个生命周期. Docker 镜像 Docke ...

  4. 大数据 --> ProtoBuf的使用和原理

    ProtoBuf的使用和原理 一.简介 Protobuf是一个灵活的.高效的用于序列化数据的协议.相比较XML和JSON格式,protobuf更小.更快.更便捷.Protobuf是跨语言的,并且自带了 ...

  5. Algorithm --> 爬楼梯求最大分数

    爬楼梯求最大分数 如下图,最大分数是: 10+20+25+20=75.        要求: 1.每次只能走一步或者两步: 2.不能连续三步走一样的,即最多连续走两次一步,或者连续走两次两步: 3.必 ...

  6. 常用linux日志查询命令

    1.查看实时日志: tail -f nohup.out 2.分页查看所有日志: cat nohup.out | more 4.分页查看前N行日志: tail -n 1000 nohup.out | m ...

  7. KVM之五:KVM日常管理常用命令

    1.查看.编辑及备份KVM 虚拟机配置文件 以及查看KVM 状态: 1.1.KVM 虚拟机默认的配置文件在 /etc/libvirt/qemu 目录下,默认是以虚拟机名称命名的.xml 文件,如下,: ...

  8. ZJOI2018游记

    我是一只普及组的菜鸡,我很菜 我参加 \(ZJOI\) 只是来试试水(水好深啊~),看看大佬(差距好大啊~),以后要好好学习 \(day0\) 下午2:00,颁奖 还以为要到很晚,还是挺快的 \(da ...

  9. SpringMVC之处理流程

    之前在学servlet时写过JavaWeb与Asp.net工作原理比较分析,那篇主要是大致描述了下servlet的工作流程,今天在家了解了下springmvc的工作原理,与asp.net中的mvc进行 ...

  10. Bean validation

    公司测试非常严格,要求我们对每个参数的长度进行校验,提了一个参数长度校验的单,然后我们老大就把我们的代码全部打回去了.... 一个bean类中往往有超多变量,如果一个个写if else,够呛,而且圈复 ...