zoukankan      html  css  js  c++  java
  • Criteria 查询

    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.简单的查询    条件查询员工信息

     1 public void Test1(){
     2         Criteria criteria = session.createCriteria(Emp.class);
     3         criteria.createAlias("dept","d");
     4         Criterion criterion= Restrictions.eq("d.deptName", "SALES");
     5         criteria.add(criterion);
     6         List<Emp> list = criteria.list();
     7         for (Emp emp : list) {
     8             System.out.println(emp.getEmpName());
     9         }
    10     }

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

    2.字符串模糊匹配

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

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

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

    1 start      员工姓名以S 开头
    2 end        员工姓名以S 结尾
    3 anywhere   员工姓名中包含S即可
    4 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.连接查询

     1 public void test5(){
     2            Session session = HibernateUtil.getSession();
     3            Transaction tx=session.beginTransaction();
     4            Criteria criteria = session.createCriteria(Emp.class); 
     5            criteria.createAlias("dept", "d");
     6            Criterion criterion = Restrictions.eq("d.deptName", "财务部");
     7            criteria.add(criterion);
     8            List<Emp> list = criteria.list();
     9            for (Emp dept : list) {
    10                System.out.println(dept.getEmpName());
    11              }
    12            tx.commit();
    13        }

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

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

     1     public void Test3(){
     2         Criteria criteria=session.createCriteria(Emp.class);
     3            Criterion criterion1 = Restrictions.eq("job", "MANAGER");
     4            Criterion criterion2 = Restrictions.ilike("empName", "C",MatchMode.ANYWHERE);
     5            Criterion and = Restrictions.disjunction().add(criterion2).add(criterion1);//(criterion1,criterion2)
     6            criteria.add(and);
     7            List<Emp> list = criteria.list();
     8            for (Emp emp : list) {
     9                   System.out.println(emp.getEmpName());
    10                }
    11            tx.commit(); 
    12     }

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

    6.排序

     1 public void test9(){
     2         Session session = HibernateUtil.getSession();
     3            Transaction tx=session.beginTransaction();
     4            Criteria criteria=session.createCriteria(Emp.class);
     5            Criterion criterion= Restrictions.gt("empId",0);
     6            
     7            criteria.add(criterion).addOrder(Order.asc("empId"));
     8            List<Emp> list = criteria.list();
     9            for (Emp emp : list) {
    10               System.out.println(emp.getEmpName());
    11            }
    12            tx.commit(); 
    13     }

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

    7.集合运算

     1        public void collectionTest(){
     2            Criteria criteria = session.createCriteria(Dept.class); 
     3            
     4            Criterion criterion = Restrictions.isEmpty("emps");
     5            
     6            criteria.add(criterion);
     8             
     9             List<Dept> list = criteria.list();
    10             for (Dept dept : list) {
    11                 System.out.println(dept.getDeptName());
    12             }
    13        }

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

    8.动态查询

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

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

    9.分页

     1 public void test10(){
     2         Session session = HibernateUtil.getSession();
     3            Transaction tx=session.beginTransaction();
     4            Criteria criteria=session.createCriteria(Emp.class);
     5            Projection projection = Projections.count("empId");
     6            criteria.setProjection(projection);
     7            //求出总记录数
     8            Integer count = ((Long)criteria.uniqueResult()).intValue();
     9            int pageSize=3;
    10            int pageIndex=2;
    11            Criteria criteria2=session.createCriteria(Emp.class);
    12            //数据的拎取
    13            criteria2.setFirstResult((pageIndex-1)*pageSize);
    14            criteria2.setMaxResults(pageSize);
    15            List<Emp> list = criteria2.list();
    16            for (Emp emp : list) {
    17                System.out.println(emp.getEmpName());
    18            }
    19            tx.commit(); 
    20     }

    解析:

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

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

    setMaxResult(int maxResult)  最大记录条数

     10.DetachedCriteria 查询

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

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

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

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

     

  • 相关阅读:
    Android.mk简介
    signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
    关于fork()函数的精辟分析
    [Ubuntu]win10卸载ubuntu
    [Shell]清空文件内容 | 使用curl进行post请求
    【Shell】在字符串中引用变量
    [Jenkins]视图
    [Jenkins]执行git push命令报错fatal: could not read Username forxxx| 配置jenkins使用ssh方式连接git
    [MAC]Permission denied, please try again.
    [Shell] 函数的应用
  • 原文地址:https://www.cnblogs.com/john69-/p/5795449.html
Copyright © 2011-2022 走看看