HibernateCriteria实现SQL语句定制

上传人:宝路 文档编号:2735679 上传时间:2017-07-27 格式:DOC 页数:12 大小:590.01KB
返回 下载 相关 举报
HibernateCriteria实现SQL语句定制_第1页
第1页 / 共12页
HibernateCriteria实现SQL语句定制_第2页
第2页 / 共12页
HibernateCriteria实现SQL语句定制_第3页
第3页 / 共12页
HibernateCriteria实现SQL语句定制_第4页
第4页 / 共12页
HibernateCriteria实现SQL语句定制_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《HibernateCriteria实现SQL语句定制》由会员分享,可在线阅读,更多相关《HibernateCriteria实现SQL语句定制(12页珍藏版)》请在金锄头文库上搜索。

1、Hibernate Criteria 对象详解1. 序言Hibernate 框架是目前 JavaEE 软件开发的企业主流框架, 学习 Hibernate 必然要掌握 ORM(对象关系映射 Object/Relation Mapping)的概念思想, Hibernate 拥有完全的ORM 理念,我们在操作数据库时,可以通过面向对象的方式就可以完成数据库的 CRUD(创建(Create) 、更新(Update) 、读取(Read)和删除(Delete) )操作。企业在使用 Hibernate 进行软件开发进行数据查询时,主要基于 HQL(Hibernate 面向对象的查询语言, 语法类似 SQL

2、) 、 Criteria (面向对象的条件查询对象) 、 SQL (原生态 SQL 语句) 几种方式, 本文重点讲解 Criteria 这种完全面向对象编程查询方式, 详细分析 Crieria 各种使用与 SQL 生成关系。2. Criteria 牛刀小试 Criteria 是一个完全面向对象,可扩展的条件查询 API ,通过它完全不需要考虑数据库底层如何实现、SQL 语句如何编写, 是 Hibernate 框架的核心查询对象。Hibernate 定义了 CriteriaSpecification 接口规范用来完成面向对象的条件查询,Criteria 就是 CriteriaSpecificat

3、ion 的子接口。2.1. 创建数据库环境 我们以 部门(Department)和员工(Employee) 案例,来讲解 Criteria 的详细使用 部门表 department 使用 mysql5.x 数据库 数据库 hibernate3 用户名 root 密码 abc 部门表 employee CREATE TABLE department (id int(11) NOT NULL auto_increment,name varchar(255) default NULL,PRIMARY KEY (id) ENGINE=InnoDB DEFAULT CHARSET=utf8;员工表 de

4、partment CREATE TABLE employee (id int(11) NOT NULL auto_increment,name varchar(255) default NULL,age int(11) NOT NULL,birthday date default NULL,department_id int(11) default NULL,PRIMARY KEY (id),FOREIGN KEY (department_id) REFERENCES department (id) ENGINE=InnoDB DEFAULT CHARSET=utf8; 2.2. 使用 JPA

5、 注解配置实体类部门类 Department员工类 Employee2.3. 使用 Crteria 查询所有部门和所有员工2.3.1. 查询所有部门产生的 SQL 语句 2.3.2. 查询所有员工产生的 SQL 语句当 session.createCriteria(实体类.class) 就会产生一条 select 所有列 from 表; SQL语句, 查询实体类对应数据表的所有记录, 然后我们就可以在这个 Criteria 对象上进行条件查询、分页查询、多表关联查询、投影查询、子查询 等一系列操作 . 3. Criteria SQL 定制详解3.1. 对查询添加条件对象 Criterionor

6、g.hibernate.criterion.Criterion 是 Hibernate 提供的一个面向对象查询条件接口,一个单独的查询就是 Criterion 接口的一个实例, 用于限制 Criteria 对象的查询, 在Hibernate 中 Criterion 对象的创建通常是通过 Restrictions 工厂类完成的。Restrictions 提供条件查询方法 例如: 1、 查询姓”张” 的所有员工信息 产生的 SQL 语句 2、 查询年龄大于 24 的所有员工 产生的 SQL 语句 3、 查询年龄小于 28 的 姓“王”的员工产生的 SQL 语句 对于多个查询条件, Restrict

7、ions 提供了逻辑组合查询方法and(Criterion lhs, Criterion rhs) 用于生成多个条件 and 关系 SQL 语句 or(Criterion lhs, Criterion rhs) 用于生成多个条件 or 关系 SQL 语句not(Criterion expression) 用于查询与条件相反的数据,生成 not 取反查询语句3.2. 分页操作 firstResult 和 maxResults Criteria 接口提供 用于分页查询的方法,实现数据库 SQL 物理级别的分页操作 setFirstResult(int firstResult) 设置记录的其实位置

8、0 代表第一条记录 setMaxResults(int maxResults) 设置查询记录的长度 例如: 我要查询 1-10 条件记录 firstResult 为 0 , maxResult 为 10 产生的 SQL 语句3.3. 排序操作 Order Hibernate 提供 org.hibernate.criterion.Order 用于排序操作 , Criteria 接口提供addOrder(Order order)用于生成排序 SQL 例如: 查询所有员工信息,按照年龄升序排列产生的 SQL 语句 3.4. 多表关联操作 createAlias 和 createCriteria Cr

9、iteria 接口提供 createAlias 和 createCriteria 两组方法用于完成多表关联查询 createAlias(String associationPath, String alias) 采用内连接关联createAlias(String associationPath, String alias, int joinType) 可以通过joinType 指定连接类型 createCriteria(String associationPath) 采用内连接关联 (返回新的 Criteria 对象)createCriteria(String associationPath,

10、 int joinType) 可以通过 joinType 指定关联类型 (返回新的 Criteria 对象 ) 例如: 查询部门为“人力资源部”的所有员工 方法一: 使用 createCriteria 方法 产生的 SQL 语句代码中的 criteria 对象,是针对 employee 表, criteria.createCriteria(”department”) 就是建立 employee 表和 department 表的内连接。 返回的是 针对department 表新的 criteria2 对象, 这时再对 criteria2 添加条件, 就是查询department 部门表的属性,而

11、不是 employee 的属性了。 方法二: 使用 createAlias 方法 使用 createAlias 方法不会像 createCriteria 那样返回一个新的 Criteria 对象,alias 只是对关联表进行别名设置,通过别名引用设置属性 产生的 SQL 语句 3.5. 投影、分组查询 Projection 在实际开发中,进行查询是, 可能只需要返回表中的指定列信息(投影) 或者进行统计查询 (count 、avg、sum、min、max) , Criteria 接口提供setProjection(Projection projection) 方法用于实现投影查询操作。 org

12、.hibernate.criterion.Projections 工厂类用于返回 Projection 投影查询对象 例如: 1. 查询员工表的 name 和 age 属性产生的 SQL 语句Projections.property(属性名) 也可以写为 Property.forName(属性名 )2查询员工的总数量 Projections 提供了分组函数的查询方法 rowCount() 查询记录总数量count(String propertyName) 统计某列数量countDistinct(String propertyName) 统计某列数量(排除重复)avg(String proper

13、tyName) 统计某列平均值 sum(String propertyName) 对某列值求和 max(String propertyName) 求某列最大值 min(String propertyName) 求某列最小值 产生的 SQL 语句 3查询每个部门的员工数量 (输出部门的编号和数量 )Projections 提供 groupProperty(String propertyName) 用于执行分组操作产生的 SQL 语句3.6. 设置结果集封装策略 ResultTransformer 刚刚说了投影操作的使用, 其实在 Hibernate 内部投影查询是会影响到结果集的封装策略的。 先

14、用 HQL 举例说明 :session.createQuery(”from Employee”).list(); 返回 List session.createQuery(”select count(e) from Employee e”).list(); 返回Listsession.createQuery(”select name,age from Employee”).list(); 返回List 从这几个例子我们不难发现,如果没有指定 select 语句(没有投影) ,那么将返回表中的所有字段,返回结果会被封装到 Entity 实体对象 Employee 中,一但提供 select 语句(

15、投影)后,返回的结果类型,将不再封装到 Employee 对象,而是根据投影的实际类型返回, 这就是投影对结果封装策略的影响。 我们再来看之前写过的 Criteria 查询案例 :session.createCriteria(Employee.class).list(); 返回 List session.createCriteria(Employee.class).setProjection(Projections.projectionList().add(Property.forName(”name”).add(Property.forName(”age”); 返回 List 投影之后, 返

16、回的结果将不再被封装到 Employee 对象中,这是为什么呢? 我们一起来看看 Criteria 的接口定义,不难发现在 Criteria 接口中提供了一个setResultTransformer(ResultTransformer resultTransformer),这个ResultTransformer 就是结果集转换策略接口, 在 Criteria 的父接口中CriteriaSpecification 定义了几个 ResultTransformer 的常用实现 ALIAS_TO_ENTITY_MAP 将结果集封装到 Map 对象 ROOT_ENTITY 将结果集封装到根实体对象DISTINCT_ROOT_ENTITY 将结果集封装到不重复的根实体对象PROJECTION 根据投影的结果类型自动封装 当进行投影查询时,结果的封装策略由 ROOT_ENTITY 变为了

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号