• QBC---Criteria查询


    QBC:Query  By Criteria     标准查询     JPA中Criteria  所有查询都需要加事务
    SQL、HQL 或者各种关键字的语句都不需要书写。全部用方法代替。
    Hibernate5.2之前 session.createCriteria(XX); 
    Hibernate5.2之后 建造者模式    重点
     //1.创建CriteriaBuilder对象,用于构建查询条件
     CriteriaBuilder cBuilder= session.getCriteriaBuilder();
     //2.构建Criteria查询对象同时要声明返回的结果类型:Person
     CriteriaQuery<Person> cQuery= cBuilder.createQuery(Person.class);
     //2.1指明要查询哪一个java持久化类  ,可以等价于HQL语句:from com.qf.domain.Person
     cQuery.from(Person.class);
     //3.执行Criteria查询
     session.createQuery(cQuery);

       1.基础查询

    //1.创建CriteriaBuilder对象,用于构建查询条件
    CriteriaBuilder cBuilder= session.getCriteriaBuilder();
    //2.构建Criteria查询对象同时要声明返回的结果类型:Person
    CriteriaQuery<Person> cQuery= cBuilder.createQuery(Person.class);
    //2.1指明要查询哪一个java持久化类  ,可以等价于HQL语句:from com.qf.domain.Person
    cQuery.from(Person.class);
    //3.执行Criteria查询
    List<Person> list = session.createQuery(cQuery).list();
    System.out.println(list); 

      2.条件查询

         where后跟的条件符:
         >      gt()  大于         >=     ge()  大于等于         <    lt()  小于    <=     le()  小于等于        ==     equal()      !=     notEqual()
        path<Number>:Integer,long,short.....
        between A and B  在A和B之间     in (......)    在某个集合范围内      like    模糊匹配       notlike  不能匹配到的是        and  and()  和
        or        or()   或者        空   isNull     非空   isNotNUll 
       Expression接口: 查询表达式 Type for query expressions.  提供的方法: isNull()  isNotNull()  in(Object... values)
         Path和Predicate是Expression的实现类
         Path:从绑定的类(type)或者集合(collection)中查找简单或者复杂的属性路径。
         程序:from(Person.class)  查找指定属性 Path<Integer> path = get("属性名"):
         Predicate:同时发生的多个或者单个限制条件
         a conjunction(连接词,同时发生) or   disjunction(分离) of restrictions.    restrictions  限制条件 

        比较大小

              CriteriaBuilder cBuilder =session.getCriteriaBuilder();
              CriteriaQuery<Person> criteriaQuery = cBuilder.createQuery(Person.class);
                Root root = criteriaQuery.from(Person.class);        
                //2.2构建查询条件 写where后的条件
                //参数1:字段表达式 ,参数2:要比较的值
                //需求:age大于20岁的
                //从Person类上查找age属性的路径
                //比较大小:gt,ge,lt,le,equal,notEqual
                Path<Integer> age =  root.get("age");
                //P通过指定路径的属性映射的列名和后面的值去比较
                Predicate pAge= cBuilder.equal(age, 18);    
                //条件必须放在where后面
                criteriaQuery.where(pAge);
                //3执行Criteria查询
                Query<Person> query = session.createQuery(criteriaQuery);    
                System.out.println(query.list()); 

        其他条件查询

            CriteriaBuilder cBuilder =session.getCriteriaBuilder();
                CriteriaQuery<Person> criteriaQuery = cBuilder.createQuery(Person.class);
                Root root = criteriaQuery.from(Person.class);        
                
                //2.2构建查询条件 写where后的条件
                //参数1:字段表达式 ,参数2:要比较的值
                //需求:name中含有g的Person
                //从Person类上查找name属性的路径
                Path<String> name =  root.get("name");
                Path<Integer> age =  root.get("age");
                //Predicate条件:
                Predicate pAge1= cBuilder.like(name, "%g%");    
                //Predicate pAge= cBuilder.notLike(name, "%g%");    
                 Predicate pAge2 =cBuilder.isNotNull(age);
                Predicate p1=  cBuilder.and(pAge1,pAge2);
                //条件必须放在where后面
                criteriaQuery.where(p1);
                
                //3执行Criteria查询
                Query<Person> query = session.createQuery(criteriaQuery);    
                System.out.println(query.list()); 

      3.分页查询

           CriteriaBuilder cBuilder=  session.getCriteriaBuilder();
                CriteriaQuery<Person> cQuery= cBuilder.createQuery(Person.class);
                Root root = cQuery.from(Person.class);
              
                Query<Person>  query = session.createQuery(cQuery);
                query.setFirstResult(0);//查询的起始位置
                query.setMaxResults(2);//每次查询数据的条数
                System.out.println(query.list()); 

       4.排序查询

           CriteriaBuilder cBuilder=  session.getCriteriaBuilder();
                CriteriaQuery<Person> cQuery= cBuilder.createQuery(Person.class);
                Root root = cQuery.from(Person.class);
                //3.1加排序 递增asc,递减desc  (属于条件类的)
                Path<String>  path=  root.get("ID");//get("持久化类要排序的属性值")    
                //3.2构建排序的条件
                Order order= cBuilder.desc(path);
                //3.3加入查询的条件
                cQuery.orderBy(order);
                //4.执行查询
                Query<Person> query = session.createQuery(cQuery);
                System.out.println(query.list()); 

      5.聚合函数查询

        //在JPA中的Criteria的所有查询中要执行调用的是以前sql中关键字的方法
        //示例: from()  select()  orderby()    where() 
        //但是条件必须都是CriteriaBuilder
        //在JPA中的Criteria的聚合函数查询中:
        //1. sum,max,min的类型跟所查询的列的类型一致
        //3. avg  结果类型是Double类型
        //4. count  结果类型是Long类型 
            CriteriaBuilder cBuilder=  session.getCriteriaBuilder();
                CriteriaQuery<Long> cQuery= cBuilder.createQuery(Long.class);
                Root root = cQuery.from(Person.class);
              
                //聚合函数select 后和from前
                //1.需求1:sum(age)
                //1.1先找出age列的路径
                /*Path<Integer> agePath = root.get("age");
                //1.2根据sum构建条件
                Expression<Integer> expression = cBuilder.sum(agePath);
                cQuery.select(expression);*/
                
                //2.需求2: count(age)
                Path<Long> agePath = root.get("age");
                //1.2根据sum构建条件
                Expression<Long> expression = cBuilder.count(agePath);
                cQuery.select(expression);
                Long sum = session.createQuery(cQuery).uniqueResult();
                System.out.println(sum); 

      6.查询多个列

            CriteriaBuilder cBuilder=  session.getCriteriaBuilder();
                CriteriaQuery<Object[]> cQuery= cBuilder.createQuery(Object[].class);
                Root root = cQuery.from(Person.class);
              
                //3.1 先查找name和address属性所在的Path路径
                Path namePath=  root.get("name");
                Path addressPath=  root.get("address");
                //3.2. 最终目的:select  name,address from  com.qf.domainn.Person
                //方式一:cQuery.multiselect(namePath,addressPath);
                //方式二:cBuilder.array(namePath,addressPath)表示把所有条件放在一个array组成一个新的对象
                cQuery.select(cBuilder.array(namePath,addressPath));
                //4.执行查询
                List<Object[]> list = session.createQuery(cQuery).list();
                for (int i = 0; i < list.size(); i++) {
                    Object[] objects = list.get(i);
                    System.out.println(objects[0]+"---"+objects[1]);
                } 

      在线查询和离线查询

        在线查询(需要用到session)

         Session session = HibernateUtils.getCurrentSession();
            CriteriaBuilder builder = session.getCriteriaBuilder();
            CriteriaQuery<Person> createQuery = builder.createQuery(Person.class);
            Root<Person> root = createQuery.from(Person.class);
            Path<Person> path = root.get("ID");
            Predicate predicate = builder.equal(path, 4);
            createQuery.where(predicate);
            Query<Person> query = session.createQuery(createQuery);
            return query.uniqueResult(); 

        离线查询

    //1.创建一个DetachedCriteria类,并且指明要查询的持久化类
    DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Person.class);
    //2.添加查询条件  Restrictions封装了大量的查询条件
    detachedCriteria.add(Restrictions.idEq(id));
    //执行数据增删查改操作
    Criteria criteria = detachedCriteria.getExecutableCriteria(session);
    criteria.uniqueResult(); 

        离线查询的聚合函数

         //1.创建一个DetachedCriteria类,并且指明要查询的持久化类
            DetachedCriteria  detachedCriteria= DetachedCriteria.forClass(Person.class);          
            //执行数据增删查改操作:
            Criteria c = detachedCriteria.getExecutableCriteria(session);
            /* c.setProjection(Projections.max("age"));
            c.setProjection(Projections.min("age"));
            c.setProjection(Projections.sum("age"));
            c.setProjection(Projections.avg("age"));*/
            c.setProjection(Projections.count("IDCard"));
            c.uniqueResult();
  • 相关阅读:
    Web负载均衡的几种实现方式
    DNS负载均衡
    NoSQL开篇——为什么要使用NoSQL
    mySQL优化 my.ini 配置说明
    mysql性能优化-慢查询分析、优化索引和配置
    MySQL性能优化的最佳20+条经验
    IOS的UIPickerView 和UIDatePicker
    IOS的KVC
    IOS中的通知NSNotification
    IOS对话框UIAlertView
  • 原文地址:https://www.cnblogs.com/a77355699/p/7886501.html
Copyright © 2020-2023  润新知