Criteria、Criterion接口和Expression类组成,他支持在运行时动态生成查询语句。

Criteria查询是Hibernate提供的一种查询方式

Hibernate检索方式:  PO=JavaBean+xml  OID

Hibernate提供了5种检索对象的方式

1.导航对象图检索方式:根据已经加载的对象导航到其他对象

from  Emp e group by e.dept.deptName

2.OID检索方式:按照对象的OID来检索对象  get/load

3.HQL检索方式:使用面向对象的HQL查询语言

4.QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口

5.本地SQL检索方式:使用本地数据库的SQL查询语句

createSqlQuery();

本文案例提供类:Emp、Dept

当前案例中所有Criteria查询条件类型皆为Criterion类型  即Restrictions为我们提供的这些静态方法返回值类型皆返回Criterion类型

Restrictions

1.简单的查询    条件查询员工信息

 public void Test1(){
Criteria criteria = session.createCriteria(Emp.class);
criteria.createAlias("dept","d");
Criterion criterion= Restrictions.eq("d.deptName", "SALES");
criteria.add(criterion);
List<Emp> list = criteria.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
}

解析: 其中使用Restrictions的eq方法   找出数据库中deptName列中名字叫做sales的员工

2.字符串模糊匹配

 public void Test2(){
Criteria criteria=session.createCriteria(Emp.class);
//like 字符串模式匹配 iLike:字符串模式匹配,同时忽略大小写
Criterion criterion = Restrictions.like("empName", "S",MatchMode.EXACT); //其中exact是指精确匹配
criteria.add(criterion);
List<Emp> list = criteria.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
tx.commit();
}

解析:Restrictions类提供了几个静态类让我们使用     此处就是使用了like()方法来查询出员工名字是S的人。

     第三个参数是MatchMode提供的静态常亮用于指定字符串模式匹配   取值分别有:

 start      员工姓名以S 开头
end 员工姓名以S 结尾
anywhere 员工姓名中包含S即可
exact 员工姓名是S(用于精确匹配)

3.范围运算符

    public void test4(){
Criteria criteria=session.createCriteria(Emp.class);
//将bj和sh放入List<String>
List<String> job=new ArrayList<String>();
job.add("MANAGER");
//citys.add("sh");
Criterion criterion = Restrictions.in("job",job);
criteria.add(criterion);
List<Emp> list = criteria.list(); for (Emp emp: list) {
System.out.println(emp.getEmpName());
} tx.commit();
}

解析:将查询条件放入List<String>  泛型中   使用Restrictions的in方法来查询符合条件的员工信息

4.连接查询

 public void test5(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Criteria criteria = session.createCriteria(Emp.class);
criteria.createAlias("dept", "d");
Criterion criterion = Restrictions.eq("d.deptName", "财务部");
criteria.add(criterion);
List<Emp> list = criteria.list();
for (Emp dept : list) {
System.out.println(dept.getEmpName());
}
tx.commit();
}

解析:给Emp类中dept属性通过createAlias(“关联属性的路径  一般是类型的某个外键属性”,“别名”)方法设置别名为"d"     然后通过dept中的deptName属性来查找相应数据。

5.逻辑运算(给criteria添加多个匹配条件)

     public void Test3(){
Criteria criteria=session.createCriteria(Emp.class);
Criterion criterion1 = Restrictions.eq("job", "MANAGER");
Criterion criterion2 = Restrictions.ilike("empName", "C",MatchMode.ANYWHERE);
Criterion and = Restrictions.disjunction().add(criterion2).add(criterion1);//(criterion1,criterion2)
criteria.add(and);
List<Emp> list = criteria.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
tx.commit();
}

解析:   Restrictions.and()   该方法返回的依然是条件   需要再次的通过criteria.add(and)   方法将其添加到其中。Disjunction()方法加入多个条件的逻辑或操作。

6.排序

 public void test9(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Criteria criteria=session.createCriteria(Emp.class);
Criterion criterion= Restrictions.gt("empId",); criteria.add(criterion).addOrder(Order.asc("empId"));
List<Emp> list = criteria.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
tx.commit();
}

解析:当前案例同过add()方法添加了查询条件后,再通过addOrder()方法通过指定的列进行正向排序。

7.集合运算

        public void collectionTest(){
Criteria criteria = session.createCriteria(Dept.class); Criterion criterion = Restrictions.isEmpty("emps"); criteria.add(criterion); List<Dept> list = criteria.list();
for (Dept dept : list) {
System.out.println(dept.getDeptName());
}
}

解析:通过判断当前部门下的员工集合是否为空来进行集合运算     上面的操作:是查找出所有员工集合为空的部门名称

8.动态查询

 public void dynamicTest(){
Criteria criteria = session.createCriteria(Emp.class);
//00.构建出一个和page对应的条件类,依次判定条件是否为空
EmpCondition condition=new EmpCondition();
condition.setEmpCity("bj");
condition.setEmpId(); //1.2判定之后,动态拼接检索条件
if (condition.getEmpCity()!=null) {
//用户填写了地址作为检索条件
criteria.add(Restrictions.eq("empCity", condition.getEmpCity()));
}
if(condition.getEmpId()!=null){
//用户填写用户编号作为筛选条件
criteria.add(Restrictions.gt("empId", condition.getEmpId()));
}
List<Emp> list = criteria.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
}

解析:通过扩展类将查询的具体属性封装起来,可以添加多个匹配条件来查询数据

9.分页

 public void test10(){
Session session = HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
Criteria criteria=session.createCriteria(Emp.class);
Projection projection = Projections.count("empId");
criteria.setProjection(projection);
//求出总记录数
Integer count = ((Long)criteria.uniqueResult()).intValue();
int pageSize=3;
int pageIndex=2;
Criteria criteria2=session.createCriteria(Emp.class);
//数据的拎取
criteria2.setFirstResult((pageIndex-1)*pageSize);
criteria2.setMaxResults(pageSize);
List<Emp> list = criteria2.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
tx.commit();
}

解析:

Criteria接口提供了设置分页的方法

setFirstResult(int firstResult)  起始记录的索引

setMaxResult(int maxResult)  最大记录条数

10.DetachedCriteria 查询

  DetachedCriteria 创建时不需要Session对象。适用于有大量动态条件查询,即用户在网页上自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查询。

  针对这种需求,对于分层应用程序来说,文本层需要传递一个查询的条件列表给业务层对象,业务层对象获得这个条件列表 之后,依次取出条件,构造查询语句。

  查询结果也可作为查询条件:例如当查询结果为平均成绩时,就可以其他成绩来和平均成绩做对比。

 /**
* 1.11 DetachedCriteria和Criteria功能类似,它实现了CriteriaSpecification接口
Criteria是由Session对象创建的
DetachedCriteria创建时不需要Session对象
使用DetachedCriteria来构造查询条件
可以把DetachedCriteria作为方法参数传递给业务层
* 查询开发部的员工
* */
@Test
public void detachedCriteriaTest(){
//难度 3颗星 重要程度五颗星 ★★★★★
//1.构建一个Detached对象
DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Emp.class);
//1.2 别名
detachedCriteria.createAlias("dept", "d");
//1.3 指定检索条件
Criterion criterion = Restrictions.eq("d.deptName", "开发部");
//bind 绑定
detachedCriteria.add(criterion);
//detachedCriteria的方法植入对session的引入 List<Emp> list = detachedCriteria.getExecutableCriteria(session).list(); for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
} }

Criteria 查询的更多相关文章

  1. Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)

    写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...

  2. NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)

    摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...

  3. Criteria查询初学者的采纳点哦

    一.Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象    from  Emp e group by e.dept.deptName 2.OID检索 ...

  4. Criteria查询之sqlRestriction()的理解

    sqlRestriction()的理解 在Criteria查询中 使用sqlRestriction()方法来提供SQL语法作限定查询,作为where字句 查看官方给的例子,如下 List cats = ...

  5. Criteria查询数据

    Criteria介绍: Criteria查询是Hibernate提供的一种查询方式,与HQL基于字符串的查询形式完全不同.Hibernate提供了org.hiberanee.Criteria 接口.o ...

  6. Hibernate框架之Criteria查询

    首先给大家说说Hibernate检索方式 Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQ ...

  7. Hibernate 、Hql查询和Criteria查询

    HQL查询: public Object query(String name){ Session s=null; try{ s=HibernateSessionFactory.getSession() ...

  8. Hibernate框架Criteria查询

    本文章适合一些初学者 一.使用Criteria查询数据        1.条件查询            1.1:使用Criteria查询的步骤                    1.使用Sess ...

  9. 第九章 Criteria查询及注解

    第九章   Criteria查询及注解9.1 使用Criteria查询数据    9.1.1 条件查询        Criteria查询步骤:            1)使用session接口的cr ...

  10. hibernate框架学习笔记7:HQL查询、Criteria查询简介

    HQL查询:hibernate独有的查询语言 适用于不复杂的多表查询 示例: 实体类: package domain; public class Customer { private Long cus ...

随机推荐

  1. 数论结论 nefu 702

    Given a prime p (p<108),you are to find min{x2+y2},where x and y belongs to positive integer, so ...

  2. vim高亮显示当前行列

    vim高亮显示当前行: set cursorline vim高亮显示当前列: set cursorcolumn

  3. 用XAMPP+Wordpress搭建个人博客

    http://biancheng.dnbcw.info/php/456308.html http://jingyan.baidu.com/article/f71d60376ba9571ab641d11 ...

  4. [bzoj1574][Usaco2009 Jan]地震损坏Damage_dfs

    地震损坏Damage bzoj-1574 Usaco-2009 Jan 题目大意:题目链接. 注释:略. 想法: 显然对于每一个report点,和它直接相连的点都不可能到达1.我们将它打上标记. 然后 ...

  5. 玲珑杯 ACM Round #10

    A 题意:给长度为n的序列染黑白色,要求连续的黑的格子数量<=a,连续的白的格子数量<=b,问方案总数,有多个询问 分析:递推 注意数据范围,是可以O(n)做的,所以可以直接递推 B 题意 ...

  6. log4j.properties的简单配置和使用

    log4j.properties  // 日志文件名不能随便写, 是properties文件 log4j.rootLogger=INFO, Console //表示INFO级别 输出到控制台 #Con ...

  7. 【UML 建模】在线UML建模工具 ProcessOn 使用具体解释

    总结 : -- 推荐理由 : 近期从 Windows 操作系统 转到 MAC 上, 正在看设计模式 和 重构, 找不到好用的 UML 工具, 因此在网上找了一款能够在线使用的 UML 工具, 用起来发 ...

  8. swift 2.0语法 元组

    import UIKit /*: 元祖 * 可以将多个值保存在一起 * 格式: (数值1, 数值2, 数值3) * 特点: 元祖可以保存不同数据类型的值 * 用途: 在C/OC中如果一个函数想返回多个 ...

  9. IDEA Spark Streaming Flume数据源 --解决无法转化为实际输入数据,及中文乱码(Scala)

    需要三步: 1.shell:往 1234 端口写数据 nc localhost 1234 2.shell: 启动flume服务 cd /usr/local2/flume/bin ./flume-ng ...

  10. C++ 指针 部分

    基本知识:在内存中的每个字节都有一个编号,这就是“地址”,相当于旅馆中的房间号.记住,内存单元的地址和内存单元的内容是两个不同的概念. 程序在编译之后,就已经将变量名转换成变量地址,对变量值的存取都是 ...