Hibernate(十五):QBC检索和本地SQL检索

  • 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", "[email protected]"));
 8         criteria.add(Restrictions.gt("salary", 1000F));
 9
10         System.out.println(criteria.uniqueResult());
11     }

执行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 protected]]

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不能涵盖所有的查询特性。

时间: 2024-08-07 00:18:50

Hibernate(十五):QBC检索和本地SQL检索的相关文章

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

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

QBC检索和本地SQL检索

细说QBC:QBC(Query By Criteria) 查询:这种方式比较面向对象方式,因为是面向对象,所以查询时参数名就是所查询的类的属性名并不是数据库的表的列名重点是有三个描述条件的对象:Restrictions,Order,Projections.使用QBC查询,一般需要以下三个步骤: 1. 使用Session实例 的createCriteria()方法创建Criteria对象 , 2. 并使用add()方法添加设置查询条件,工具类Restrictions的方法为Criteria对象设置

Hibernate之QBC检索和本地SQL检索

QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口 本地SQL查询来完善HQL不能涵盖所有的查询特性. ====================代码区====================== 测试类 1 package com.yl.hibernate.test; 2 3 4 import java.util.ArrayList; 5 import java.util.A

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

hibernate有五种检索方式,这儿用 单向的一对多的映射关系 例子,这儿有后三种的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 HQL 检索方式: 使用面向对象的 HQL 查询语言 QBC 检索方式: 使用 QBC(Query By Criteria) API 来检索对象. 这种 API 封装了基于字符串形式的查询语句, 提供了更加面向对象的查询接口. 本地 SQL 检索方式: 使用本地数据库的 SQL 查询语句 建立封装

第十五周翻译-《Pro SQL Server Internals, 2nd edition》

<Pro SQL Server Internals, 2nd edition> 作者:Dmitri Korotkevitch 翻译:赖慧芳 译文: 55-58页 第三章 统计 SQL Server查询优化器在为查询选择执行计划时使用基于成本的模型.它估计不同执行计划的成本,并选择成本最低的一个.但是,请记住,SQL Server并不搜索可用于查询的最佳执行计划,因为评估所有可能的替代方案在CPU方面既费时又昂贵.查询优化器的目标是找到一个足够好的执行计划,足够快. 基数估计(在查询执行的每个步

Hibernate(十五)注解

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

十五周翻译《Pro SQL Server Internals, 2nd edition》 CHAPTER 7

文章来自<Pro SQL Server Internals, 2nd edition>的CHAPTER 7 Designing and Tuning the Indexes中的Clustered Index Design Considerations> 原作者:Dmitri Korotkevitch 第七章  设计和调整索引 无法定义可在任何地方使用的索引策略. 每个系统都是独特的,需要它自己的索引方法基于工作量,业务需求和其他一些因素.但是,有几个设计考虑因素和指南可以应用于每个系统.

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

1.非集成Spring hibernate的检索方式,主要有以下五种. 1.导航对象图检索方式.(根据已经加载的对象,导航到其他对象.) 2.OID检索方式.(按照对象的OID来检索对象.) 3.HQL检索方式.(使用面向对象的HQL查询语言.) 4.QBC检索方式.(使用QBC(Qurey By Criteria) API来检索对象.) 5.本地SQL检索方式.(使用本地数据库的SQL查询语句.) 1.导航对象图检索方式 利用类与类之间的关系来检索对象.譬如我们要查找一份订单,就可以由订单对象

Hibernate —— HQL、QBC检索方式

一.HQL 检索方式 以双向的一对多来测试 HQL 检索方式.以 Department 和 Employee 为例. 建表语句: CREATE TABLE department ( dept_id INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, dept_name VARCHAR(50) ); CREATE INDEX FK_8hf3vewo7w3v9doungcc51wwy ON department (dept_id); CREATE TABLE e