第九章 Criteria查询及注解
第九章 Criteria查询及注解
9.1 使用Criteria查询数据
9.1.1 条件查询
Criteria查询步骤:
1)使用session接口的createCriteria()方法创建Criteria对象
2)使用Restrictions类提供静态方法设置条件,返回Criterion对象
3)使用Criteria接口的list()方法执行查询语句
例:查询所有部门
Criteria criteria=session.createCriteria(Dept.class);
List<Dept> list=criteria.list();
for(Dept dept:list){
System.out.println(dept.getDeptno()+","+dept.getDname());
}
查询条件:
1、比较运算
= Restrictions.eq(String propertyName,Object value) 等于
<> Restrictions.ne(String propertyName,Object value) 不等于
> Restrictions.gt(String propertyName,Object value) 大于
>= Restrictions.ge(String propertyName,Object value) 大于等于
< Restrictions.lt(String propertyName,Object value) 小于
<= Restrictions.le(String propertyName,Object value) 小于等于
is null Restrictions.isNull(String propertyName) 等于空
is not null Restrictions.isNotNull(String propertyName) 不等于空
例1:查询工资高于5000的员工
List<Emp> list=session.createCriteria(Emp.class)
.add(Restrictions.gt("sal", 5000D)).list();
for(Emp emp:list){
System.out.println(emp.getEmpno()+","+emp.getEname());
}
例2:查询不属于人和我部门的员工
List<Emp> list=session.createCriteria(Emp.class)
.add(Restrictions.isNull("dept")).list();
for(Emp emp:list){
System.out.println(emp.getEname());
}
2、范围运算
in Restrictions.in(String propertyName,Connection value)
Restrictions.in(String propertyName,Object[] value)
not in Restrictions.not(Restrictions.in())
between...and... Restrictions.between(String propertyName,Object lo,Object hi)
not between...and... Restrictions.not(Restrictions.between())
例1:查询职位是SALESMAN 或 MANAGER 的员工
List jobList=new ArrayList();
jobList.add("SALESMAN");
jobList.add("MANAGER");
List<Emp> list=session.createCriteria(Emp.class)
.add(Restrictions.in("job", jobList)).list();
for(Emp emp:list){
System.out.println(emp.getEname()+" "+emp.getJob());
}
例2:查询工资在2000~4000之间的员工
List<Emp> list=session.createCriteria(Emp.class)
.add(Restrictions.between("sal", 2000D, 4000D)).list();
for(Emp emp:list){
System.out.println(emp.getEname()+" "+emp.getSal());
}
3、字符串模式匹配
Restrictions.like(String propertyName,Object value)
Restrictions.like(String propertyName,Object value,MatchMode matchMode) 字符串模式匹配
like
Restrictions.ilike(String propertyName,Object value)
Restrictions.ilike(String propertyName,String value,MatchMode matchMode) 字符串模式匹配,忽略大小写
例1:查询姓名中包括S的员工
List<Emp> list=session.createCriteria(Emp.class)
.add(Restrictions.like("ename", "%S%")).list();
for(Emp emp:list){
System.out.println(emp.getEname());
}
例2:使用MatchMode类的静态常量进行字符串匹配
List<Emp> list=session.createCriteria(Emp.class)
.add(Restrictions.ilike("ename", "s", MatchMode.ANYWHERE)).list();
for(Emp emp:list){
System.out.println(emp.getEname());
}
MatchMode类的静态常量
MatchMode.START Restrictions.like("empName","s",MatchMode.START) 员工姓名以s开头
MatchMode.END Restrictions.like("empName","s",MatchMode.END) 员工姓名以s结尾
MatchMode.ANYWHERE Restrictions.like("empName","s",MatchMode.ANYWHERE) 员工姓名包含s
MatchMode.EXACT Restrictions.like("empName","s",MatchMode.EXACT) 员工姓名等于s
4、逻辑运算
and Restrictions.and(Criteria lhs,Criterion rhs) 与
or Restrictions.or(Criteria lhs,Criterion rhs)
Restrictions.disjunction() 或
not Restrictions.not(Criterion expression) 非
例:查询职位是SALESMAN 或 MANAGER 的员工
List<Emp> list=session.createCriteria(Emp.class)
.add(Restrictions.or(Restrictions.eq("job", "SALESMAN"),
Restrictions.eq("job", "MANAGER"))).list();
for(Emp emp:list){
System.out.println(emp.getEname());
}
例:查询职位是SALESMAN 或 MANAGER 或 CLERK 的员工
List<Emp> list=session.createCriteria(Emp.class)
.add(Restrictions.disjunction().add(Restrictions.eq("job", "CLERK"))
.add(Restrictions.eq("job", "MANAGER"))
.add(Restrictions.eq("job", "SALESMAN"))).list();
for(Emp emp:list){
System.out.println(emp.getEname());
}
5、集合运算
is empty Restrictions.isEmpty(String propertyName) 集合为空
is not empty Restrictions.isNotEmpty(String propertyName) 集合不为空
例: 查询没有员工的部门
List<Dept> list=session.createCriteria(Dept.class)
.add(Restrictions.isEmpty("emps")).list();
for(Dept dept: list){
System.out.println(dept.getDname());
}
9.1.2 动态查询
9.2 排序,分页及关联
9.2.1 排序(Order)
例:查询工资高于4000的员工,按工资升序排列
List<Emp> list=session.createCriteria(Emp.class)
.add(Restrictions.gt("sal", 4000D))
.addOrder(Order.asc("sal"))
.addOrder(Order.desc("empno")).list();
for(Emp emp:list){
System.out.println(emp.getEname()+","+emp.getSal());
}
9.2.2 分页查询
setFirstResult(int firstResult):设置从哪一个对象开始查询
setMaxResults( int maxResult):设置一次最多查询出的对象个数
例: 查询职位是SALESMAN的员工。按工资降序排列,每页显示两条记录输出第一页信息,输出总页数,总记录数,当前页号
Criteria criteria=session.createCriteria(Emp.class)
.add(Restrictions.eq("job", "SALESMAN").ignoreCase())
.setProjection(Projections.count("empno"));
Integer count=(Integer) criteria.uniqueResult();
//分页
int pageSize=2;//每页显示记录数
int totalpages=(count%pageSize==0)?(count/pageSize):(count/pageSize+1);//总页数
int pageIndex=1;
criteria=session.createCriteria(Emp.class)
.add(Restrictions.eq("job", "SALESMAN").ignoreCase())
.addOrder(Order.desc("sal"));
List<Emp> list=criteria.setFirstResult((pageIndex-1)*pageSize)
.setMaxResults(pageSize).list();
for(Emp emp:list){
System.out.println(emp.getEname()+","+emp.getSal());
}
System.out.println("总页数:"+totalpages+",总记录数:"+count+",当前页号:"+pageIndex);
9.2.3 查询唯一对象
Query和Criteria接口执行查询的方法
List list() 返回List集合
Iterator iterate() 返回Iterator迭代器 Criteria不支持
Object uniqueResult() 返回唯一对象
例:查询工资最高的员工
Emp emp=(Emp) session.createCriteria(Emp.class)
.add(Restrictions.isNotNull("sal"))
.addOrder(Order.desc("sal"))
.setMaxResults(1).uniqueResult();
System.out.println(emp.getEname()+","+emp.getSal());
9.2.4 连接查询
例:查询财务部的姓名包括A的员工
List<Emp> list=session.createCriteria(Emp.class,"e")
.createAlias("dept", "d")
.add(Restrictions.ilike("e.ename", "a",MatchMode.ANYWHERE))
.add(Restrictions.eq("d.dname", "财务部").ignoreCase()).list();
for(Emp emp:list){
System.out.println(emp.getEname()+","+emp.getDept().getDname());
}
例:查询位置子啊“东一区” 的部门及其员工数setFetchMode()设置迫切左外链接
List<Dept> list=session.createCriteria(Dept.class,"d")
.setFetchMode("emps", FetchMode.JOIN)
.add(Restrictions.eq("d.loc", "东一区").ignoreCase()).list();
HashSet<Dept> set=new HashSet<Dept>(list);
for(Dept dept:set){
System.out.println(dept.getDname()+","+dept.getLoc()+","+dept.getEmps().size());
}
9.3 投影,分组及DetachedCriteria
9.3.1 使用投影和分组
例:查询员工姓名和入职时间
List<Object[]> list=session.createCriteria(Emp.class)
.setProjection(Projections.projectionList()
.add(Property.forName("ename"))
.add(Property.forName("hiredate"))).list();
for(Object[] obj:list){
System.out.println(obj[0]+","+new Date(((Timestamp) obj[1]).getDateTime()));
}
Projections常用聚合查询方法
Projections.groupProperty(String propertyName) 分组
Projections.rowCount() 统计记录数
Projections.avg(String PropertyName) 统计平均值
Projections.max(String PropertyName) 统计最大值
Projections.min(String PropertyName) 统计最小值
Projections.count(String PropertyName) 统计某字段的非空记录数
Projections.sum(String PropertyName) 统计某一字段求和
例:List<Object[]> list=session.createCriteria(Emp.class,"e")
.createAlias("e.dept", "d")
.setProjection(Projections.projectionList()
.add(Projections.groupProperty("d.dname"))
.add(Projections.avg("e.sal"))
.add(Projections.max("e.sal"))
.add(Projections.min("e.sal"))
).list();
for(Object[] obj:list){
System.out.println(obj[0]+","+obj[1]+","+obj[2]+","+obj[3]);
}
9.3.2 使用DetachedCriteria
Criteria和DetachedCriteria区别
Criteria是由session对象创建的
DetachedCriteria创建不需要session对象
例:使用DetachedCriteria查询财务部的姓名包括A的员工
DetachedCriteria detachedCridteria=DetachedCriteria.forClass(Emp.class,"e")
.createAlias("e.dept", "d")
.add(Restrictions.eq("d.dname", "财务部"))
.add(Restrictions.ilike("e.ename", "a",MatchMode.ANYWHERE));
List<Emp> list=detachedCridteria.getExecutableCriteria(session).list();
for(Emp emp:list){
System.out.println(emp.getEname()+","+emp.getDept().getDname());
}
例:DetachedCriteria avgSal=DetachedCriteria.forClass(Emp.class,"e")
.setProjection(Property.forName("sal").avg());
List<Emp> list=session.createCriteria(Emp.class)
.add(Property.forName("sal").gt(avgSal)).list();
for(Emp emp:list){
System.out.println(emp.getEname()+","+emp.getSal());
}
9.4 注解
9.4.1 Hibernate注解使用步骤
1)添加jar包
2)使用注解配置持久化类及对象关联关系
3)使用AAnnotationConfiguration建立回话工厂
4)在Hibernate配置文件中声明持久化类
9.4.2 注解配置持久化类
@Entity 将一个类声明为持久化类
@Id 声明持久化类的标识属性
@GeneratedValue 定义标识属性的生成策略
@Table 为持久化类指定包
@UniqueConstraint 定义表的唯一约束
@Lob 表示属性将被持久化类化为Blob或Clob类型
@Column 将属性映射到
@Transient 忽略这些字段和属性
@Table可以省略,默认值为持久化类名
@GeneratedValue 定义标识属性的生成策略
AUTO 根据不同数据库选择不同策略
TABLE 使用表保存id值
INDENITY 使用数据库自动生成主键
SEQENCE 使用序列创建主键
例:Emp.java
@Entity
@Table(name="EMP")
public class Emp implements Serializable{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_emp")
@SequenceGenerator(name="seq_emp",sequenceName="seq_emp_id",allocationSize=1,initialValue=1)
private Integer empno;
@Column(name="ENAME")
private String ename;
@Transient
private String job;
@Transient
private Short mgr;
@Column(name="HIREDATE")
private Date hiredate;
@Transient
private Double sal;
@Transient
private Double comm;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="DEPTNO")
private Dept dept;
<!-- Hibernate.cfg.xml配置 -->
测试代码:
SessionFactory sf=new AnnotationConfiguration().configure().buildSessionFactory();
Session session=sf.openSession();
Transaction tx=(Transaction) session.beginTransaction();
Emp emp=new Emp();
emp.setEname("test1");
emp.setHiredate(new Date());
session.save(emp);
tx.commit();
9.4.3 注解配置对象关联关系
@OneToOne 一对一
@OneToMany 一对多
@ManyToOne 多对一
@ManyToMany 多对多
9.4.4 注解配置命名查询
例:@NamedQuery(name="selectEmp",query="from Emp where empName like:ename")
第九章 Criteria查询及注解的更多相关文章
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...
- 通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile
通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁 ...
- NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)
摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...
- 第九章:四大组件之Broadcast Receiver
第九章:四大组件之Broadcast Receiver 一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和 ...
- 《Django By Example》第九章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag 注:哈哈哈,第九章终于来啦 ...
- 第九章 MySQL中LIMIT和NOT IN案例
第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...
- Testlink1.9.17使用方法(第九章 测试结果分析)
第九章 测试结果分析 QQ交流群:585499566 TestLink根据测试过程中记录的数据,提供了较为丰富的度量统计功能,可以直观的得到测试管理过程中需要进行分析和总结的数据.点击首页横向导航栏中 ...
- 鸟哥的Linux私房菜——第九章
视频链接,推荐看B站 土豆网:http://www.tudou.com/programs/view/XmMDbjJHJC8 B站:http://www.bilibili.com/video/av966 ...
- JPA criteria 查询:类型安全与面向对象
参考:https://my.oschina.net/zhaoqian/blog/133500 一.JPA元模型概念,及使用 在JPA中,标准查询是以元模型的概念为基础的.元模型是为具体持久化单元的受管 ...
随机推荐
- Spring Cache扩展:注解失效时间+主动刷新缓存
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- Bean复制
有的时候我们需要将一个bean的属性赋值到另一个bean的属性中,比如用户提交过来的表单bean需要将该bean中的属性值赋值到对应的数据库bean,我们通常会以这样的方式做: User user = ...
- Java程序员入门:Java程序员面试失败的5大原因
1 说得太少 尤其是那些开放式的问题,如"请介绍下你自己"或"请讲一下你曾经解决过的复杂问题".面试官会通过你对这些技术和非技术问题的回答来评估你的激情.他们也 ...
- DOM操作和样式操作库的封装
一.DOM常用方法和属性复习 以下粗略的罗列一下DOM的常用方法和属性,由于不是介绍DOM的基础内容,所以就不一一详细说明各个方法和属性了(学习DOM的封装的,一般都对基础DOM比较熟悉了). 1.1 ...
- WF学习思维导图
原文 来自我的有道笔记-老文重发系列 如果配置加载核心服务,那么需要将持久化服务和跟踪服务放在一个数据库中! 1.用工作流的优点 a.提供将复杂任务分解的途径,通过将每个操作分解到活动中更便于业务 ...
- Android7.0 Phone应用源码分析(四) phone挂断流程分析
电话挂断分为本地挂断和远程挂断,下面我们就针对这两种情况各做分析 先来看下本地挂断电话的时序图: 步骤1:点击通话界面的挂断按钮,会调用到CallCardPresenter的endCallClicke ...
- JavaScript当页面关闭时向后台发送请求
今天做项目时遇上一个需求,当浏览器或页面关闭时将数据存储到数据库内.实现思想是采用js监测onunload然后发送请求.结果失败,刷新可以发送但是关闭并不能,整了一整天并没有解决,最后找到了解决办法. ...
- php人员权限管理(RBAC)
在说权限管理前,应该先知道权限管理要有哪些功能: (1).用户只能访问,指定的控制器,指定的方法 (2).用户可以存在于多个用户组里 (3).用户组可以选择,指定的控制器,指定的方法 (4).可以添 ...
- “倔驴”一个h5小游戏的实现和思考(码易直播)——总结与整理
3月23日晚上8点半(中国队火拼韩国的时候),做了一期直播分享.15年做的一个小游戏,把核心代码拿出来,现场讲写了一遍,结果后面翻车了,写错了两个地方,导致运行效果有点问题,直播边说话边写代码还真不一 ...
- 对Golang有兴趣的朋友,推荐一款go语言Web框架-dotweb
Go语言,2009年推出,对我个人,2015年下半年,才下定决心正式开始引入使用Go,自此,让我获得了一种全新的开发体验. 在不断的项目过程中,一个开发人员总喜欢堆积一些代码段,由于Go的开源特性,逐 ...