• QBC检索

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

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

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

执行sql及结果:

  1. Hibernate:
  2. select
  3. this_.ID as ID1_1_0_,
  4. this_.NAME as NAME2_1_0_,
  5. this_.SALARY as SALARY3_1_0_,
  6. this_.EMAIL as EMAIL4_1_0_,
  7. this_.DEPARTMENT_ID as DEPARTME5_1_0_
  8. from
  9. DX_EMPLOYEE this_
  10. where
  11. this_.EMAIL=?
  12. and this_.SALARY>?
  13. Employee [id=11, name=tommy10, salary=10000.0, email=tommy10@dx.com]

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

  1. @Test
  2. public void testCriteraAndOr() {
  3. Criteria criteria = session.createCriteria(Employee.class);
  4.  
  5. // AND :使用Conjunction表示,Conjunction本身就是一个Criterion对象,且其中还可以添加Criterion对象
  6. Conjunction conjunction = Restrictions.conjunction();
  7. conjunction.add(Restrictions.like("name", "2", MatchMode.ANYWHERE));
  8. Department depart = new Department();
  9. depart.setId(5);
  10. conjunction.add(Restrictions.eq("department", depart));
  11.  
  12. // OR
  13. Disjunction disjunction = Restrictions.disjunction();
  14. disjunction.add(Restrictions.gt("salary", 10000F));
  15. disjunction.add(Restrictions.isNull("email"));
  16.  
  17. criteria.add(disjunction);
  18. criteria.add(conjunction);
  19.  
  20. List<Employee> items = (List<Employee>) criteria.list();
  21. System.out.println(items.size());
  22. }

执行sql及结果:

  1. Hibernate:
  2. select
  3. this_.ID as ID1_1_0_,
  4. this_.NAME as NAME2_1_0_,
  5. this_.SALARY as SALARY3_1_0_,
  6. this_.EMAIL as EMAIL4_1_0_,
  7. this_.DEPARTMENT_ID as DEPARTME5_1_0_
  8. from
  9. DX_EMPLOYEE this_
  10. where
  11. (
  12. this_.SALARY>?
  13. or this_.EMAIL is null
  14. )
  15. and (
  16. this_.NAME like ?
  17. and this_.DEPARTMENT_ID=?
  18. )
  19. 2

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

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

执行sql及结果:

  1. Hibernate:
  2. select
  3. max(this_.SALARY) as y0_
  4. from
  5. DX_EMPLOYEE this_
  6. 79000.0

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

  1. @Test
  2. public void testOrderByAndPager() {
  3. Criteria criteria = session.createCriteria(Employee.class);
  4.  
  5. // 1) Order By
  6. criteria.addOrder(Order.desc("salary"));
  7. criteria.addOrder(Order.desc("name"));
  8.  
  9. // 2) Pager
  10. int pageSize = 5;
  11. int pageNum = 2;
  12. List<Employee> employees = (List<Employee>) criteria.setFirstResult((pageNum - 1) * pageSize).setMaxResults(pageSize).list();
  13.  
  14. System.out.println(employees.size());
  15. }

执行sql及结果:

  1. Hibernate:
  2. select
  3. this_.ID as ID1_1_0_,
  4. this_.NAME as NAME2_1_0_,
  5. this_.SALARY as SALARY3_1_0_,
  6. this_.EMAIL as EMAIL4_1_0_,
  7. this_.DEPARTMENT_ID as DEPARTME5_1_0_
  8. from
  9. DX_EMPLOYEE this_
  10. order by
  11. this_.SALARY desc,
  12. this_.NAME desc limit ?,
  13. ?
  14. 5

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

  • 本地SQL查询

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

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

执行sql及结果:

  1. Hibernate:
  2. insert
  3. into
  4. dx_department
  5. (id,name)
  6. values
  7. (?,?);
  8. Hibernate:
  9. select
  10. department0_.ID as ID1_0_0_,
  11. department0_.NAME as NAME2_0_0_
  12. from
  13. DX_DEPARTMENT department0_
  14. where
  15. department0_.ID=?
  16. Department [id=7, name=移动部门]
  • HQL删除操作:
  1. @Test
  2. public void testDeleteWithHQL() {
  3. String hql = "DELETE FROM Department d WHERE d.id=:id";
  4. session.createQuery(hql).setInteger("id", 7).executeUpdate();
  5. }

执行sql及结果:

  1. Hibernate:
  2. delete
  3. from
  4. DX_DEPARTMENT
  5. where
  6. 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. 在 Scale Up 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(145)

    对于多副本应用,当执行 Scale Up 操作时,新副本会作为 backend 被添加到 Service 的负责均衡中,与已有副本一起处理客户的请求.考虑到应用启动通常都需要一个准备阶段,比如加载缓存 ...

  2. git使用.gitignore设置不生效或不起作用的问题

    偶然遇到的问题,记录如下: 通常我们在push项目时,会有些配置文件或本地文件不想上传到服务器上 这时候我们会通过设置.gitignore  文件 一般设置成这样: # 20170418 by 51a ...

  3. 笔记:Spring Cloud Ribbon 客户端配置详解

    自动化配置 由于 Ribbon 中定义的每一个接口都有多种不同的策略实现,同时这些接口之间又有一定的依赖关系,Spring Cloud Ribbon 中的自动化配置能够很方便的自动化构建接口的具体实现 ...

  4. DevOps实践之Jenkins安装部署

    Prerequisites Minimum hardware requirements: 256 MB of RAM 1 GB of drive space (although 10 GB is a ...

  5. Oracle之SQL优化专题01-查看SQL执行计划的方法

    在我2014年总结的"SQL Tuning 基础概述"中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执 ...

  6. I Know Alpha冲刺随笔集

    Alpha冲刺 Day1 Alpha冲刺 Day2 Alpha冲刺 Day3 Alpha冲刺 Day4 Alpha冲刺 Day5 Alpha冲刺 Day6 Alpha冲刺 Day7 Alpha冲刺 D ...

  7. IT & ME

    第一部分:结缘计算机 填报志愿的那天晚上,老爸老妈和我一起在房间里讨论专业选择的事情.因为我性格比较内敛,家人建议我去学医.而我又对学医一点也不感冒,再加上自己高中时期一直喜欢玩游戏,于是最后就填报了 ...

  8. c语言博客第二次作业

    一.PTA实验作业 题目1:计算分段函数[2] 1.实验代码 { double x,y; scanf("%lf",&x); if(x>=0) { y=pow(x,0. ...

  9. 学号:201621123032 《Java程序设计》第4周学习总结

    1:本周学习总结 1. 写出你认为本周学习中比较重要的知识点关键词 继承,多态,父类object,抽象类 2. 尝试使用思维导图将这些关键词组织起来 2:书面作业 2.1: 面向对象设计 1. 讲故事 ...

  10. C语言:第0次作业

    问题1: 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 感性地讲,高中时意外看到了电影<社交网络>,自那时起就将将马克扎克伯格视为偶像,他天才的智慧和长远的眼光深深吸引了我 ...