• 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. Vue解析三之过滤器

    export function formatDate(date, fmt) { if (/(y+)/.test(fmt)) { fmt = fmt.replace(RegExp.$1, (date.g ...

  2. Linux centos 7 安装NFS服务

    NFS服务简介:NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下.---主要功能指的是共享文件 为什么要安装NF ...

  3. ELK学习笔记(三)单台服务器多节点部署

    一般情况下单台服务器只会部署一个ElasticSearch node,但是在学习过程中,很多情况下会需要实现ElasticSearch的分布式效果,所以需要启动多个节点,但是学习开发环境(不想开多个虚 ...

  4. 总结linux路由技术

    Linux系统的route命令用于显示和操作IP路由表,要实现两个不同的网段之间的通信,需要一台连接两个网络的路由器,或者同时连接位于两个网络的网关来实现. 在Linux系统中,设置路由通常是为了解决 ...

  5. linux拓展下:批量改扩展名的方法

    [root@oldboy oldboy]# ll total 0 -rw-r--r-- 1 root root 0 Nov 13 19:38 stu_102999_1_.jpg -rw-r--r-- ...

  6. linux --> 获取系统启动时间

    获取系统启动时间 一.前言 时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同.linux内核里面用一个名为jiffes的常量来计算时间戳.应用层有time.getdaytim ...

  7. 论文阅读——Visual inertial odometry using coupled nonlinear optimization

    简介:论文提出一种新的视觉里程计算法,其直接利用带噪声的IMU数据和视觉特征位置来优化相机位姿.不同于对IMU和视觉数据运行分离的滤波器,这种算法将它们纳入联合的非线性优化框架中.视觉特征的透视重投影 ...

  8. 项目Alpha冲刺Day6

    一.会议照片 二.项目进展 1.今日安排 熟悉后台框架并编写.继续搭建前台框架模版.熟悉前端框架开发流程.完成前端热部署配置.完成部分后台用户信息相关接口.解决后台jdk1.8日期在框架中的使用. 2 ...

  9. 2017 清北济南考前刷题Day 3 morning

    实际得分:100+0+0=100 T1 右上角是必败态,然后推下去 发现同行全是必胜态或全是必败态,不同行必胜必败交叉 列同行 所以n,m 只要有一个是偶数,先手必胜 #include<cstd ...

  10. mongo数据库的常见操作

    连接mongodb数据库的命令查看对应数据库mongo.exeuse shujukuming;db.opportunity.findOne({"id":5}); db.opport ...