• 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. Ubuntu16.04 中 Vscode 如何断点调试C语言程序

    个人博客链接:Ubuntu16.04 中 Vscode 如何断点调试C语言程序 问题:环境是 Ubuntu16.04,如何使用 Vscode 断点调试C语言程序. 写代码没有调试环境是不能忍受的,所以 ...

  2. 快速排序及优化(Java实现)

    普通快速排序 找一个基准值base,然后一趟排序后让base左边的数都小于base,base右边的数都大于等于base.再分为两个子数组的排序.如此递归下去. public class QuickSo ...

  3. Java生成图片验证码

    在日常我们在登录或者注册的时候,网页上会出现验证码让我们填写,其实利用jdk提供给我们的工具类完全可以模拟出来一个生成验证码图片的功能. package util; import javax.imag ...

  4. poj 3620

    题意:给出一个矩阵,其中有些格子干燥.有些潮湿. 如果一个潮湿的格子的相邻的四个方向有格子也是潮湿的,那么它们就可以构成更大 的湖泊,求最大的湖泊. 也就是求出最大的连在一块儿的潮湿的格子的数目. # ...

  5. Redis set集合结构及命令详解

    set 无序集合 集合的性质: 唯一性,无序性,确定性 注: 在string和link的命令中,可以通过range 来访问string中的某几个字符或某几个元素 但,因为集合的无序性,无法通过下标或范 ...

  6. android scrollview 属性

     理论部分1.ScrollView和HorizontalScrollView是为控件或者布局添加滚动条2.上述两个控件只能有一个孩子,但是它并不是传统意义上的容器3.上述两个控件可以互相嵌套4.滚动条 ...

  7. css3图片模糊过滤特效

    体验效果:点击这里查看效果 代码如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...

  8. 笔试常考--浏览器兼容性问题及解决方案(CSS)

    问题一:不同浏览器的标签默认的外补丁和内补丁不同 问题现象:随便写几个标签,不加样式控制的情况下,各自的margin 和padding差异较大. 解决方案:css里加: ;;} 备注:这个是最常见的也 ...

  9. C语言--第14.15周作业

    一. 7-3 将数组中的数逆序存放 1.代码 #include 2<stdio.h> int main() { int a[10]; int i, n, s; scanf("%d ...

  10. Tornado 网站demo 一

    web服务器的工作过程 创建 listen socket, 在指定的监听端口, 等待客户端请求的到来 listen socket 接受客户端的请求, 得到 client socket, 接下来通过 c ...