于洋(传智播客上海校区Java高级讲师)
个人简介:Java企业级应用专家、Web技术领域专家,中国科学院软件工程硕士。从事多年JavaEE、Web方向的研发、设计和管理工作,自2007年起,从事IT培训行业,曾主持研发过多套软件培训课程体系与教材,精通JavaEE、PHP、RUBY、JavaScript、RIA等多种主流企业开发语言。曾主持参与开发的主要项目:中国联通UMMS二期工程、中国联通SPMC二期工程、中国联通整曲下载增值业务管理平台、中国联通广东电子工单OA系统、电信增值业务管理平台、黑龙江电信语音IVR管理平台。授课重点突出,感染力强,风趣幽默,将复杂技术原理与实际应用紧密结合,能够根据学员特点因材施教,受广大学员一致好评。
1.序言
Hibernate框架是目前JavaEE软件开发的企业主流框架,学习Hibernate必然要掌握ORM(对象关系映射Object/Relation Mapping)的概念思想, Hibernate拥有完全的ORM理念,我们在操作数据库时,可以通过面向对象的方式就可以完成数据库的CRUD(创建(Create)、更新(Update)、读取(Read)和删除(Delete))操作。
企业在使用Hibernate进行软件开发进行数据查询时,主要基于HQL(Hibernate 面向对象的查询语言,语法类似SQL)、 Criteria(面向对象的条件查询对象)、SQL(原生态SQL语句)几种方式,本文重点讲解Criteria 这种完全面向对象编程查询方式,详细分析Crieria各种使用与SQL生成关系。
2.Criteria牛刀小试
Criteria 是一个完全面向对象,可扩展的条件查询API,通过它完全不需要考虑数据库底层如何实现、SQL语句如何编写,是Hibernate框架的核心查询对象。
Hibernate 定义了CriteriaSpecification接口规范用来完成面向对象的条件查询,Criteria 就是CriteriaSpecification的子接口。
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;
员工表 department 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注解配置实体类 部门类 Department
员工类 Employee
2.3使用Crteria查询所有部门和所有员工 2.3.1查询所有部门 产生的SQL语句: 查询所有员工 产生的SQL语句: 当session.createCriteria(实体类.class) 就会产生一条select所有列from 表;SQL语句,查询实体类对应数据表的所有记录,然后我们就可以在这个Criteria对象上进行条件查询、分页查询、多表关联查询、投影查询、子查询等一系列操作…… 3.Criteria SQL定制详解 3.1对查询添加条件对象Criterion org.hibernate.criterion.Criterion是Hibernate提供的一个面向对象查询条件接口,一个单独的查询就是Criterion接口的一个实例,用于限制Criteria对象的查询,在Hibernate中Criterion对象的创建通常是通过Restrictions 工厂类完成的。 Restrictions 提供条件查询方法: 例如: 1、查询姓“张”的所有员工信息 产生的SQL语句:
2、查询年龄大于24的所有员工 产生的SQL语句: 3、查询年龄小于28的姓“王”的员工 产生的SQL语句: 对于多个查询条件,Restrictions提供了逻辑组合查询方法。 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)设置记录的起始位置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语句: |