美文网首页Android开发Android开发经验谈Java
【Java中级】12.0 SSH之Hibernate框架(九)—

【Java中级】12.0 SSH之Hibernate框架(九)—

作者: bobokaka | 来源:发表于2020-02-11 02:00 被阅读0次

    本篇内容源代码:
    Github —— HibernateQueryDemo

    1.0 不是所有查询都支持QBC查询

    QBC查询:Query By Criteria,条件查询,一种更加面向对象化的查询方式。
    相比于HQL查询,QBC更适合做条件查询。

    2.0 简单查询

    在项目中新建HibernateDemo2.java方法


    image.png
    package com.edp.hibernate.demo1;
    
    /**
     * 
     * @Title: HibernateDemo2.java
     * @Package com.edp.hibernate.demo1
     * @author EdPeng
     * @version 创建时间 2020年2月9日下午6:42:17
     * @Description QBC查询
     * @version V1.0
     */
    
    import java.util.List;
    
    import javax.persistence.criteria.CriteriaBuilder;
    import javax.persistence.criteria.CriteriaQuery;
    import javax.persistence.criteria.Predicate;
    import javax.persistence.criteria.Root;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.hibernate.criterion.Order;
    import org.junit.Test;
    
    import com.edp.hibernate.domain.Customer;
    import com.edp.hibernate.utils.HibernateUtils;
    
    public class HibernateDemo2 {
        @Test
        /**
         * @Title: demo1
         * @Description: 简单的查询
         * @param
         * @return void
         * @throws
         *
         */
        public void demo1() {
            Session session = HibernateUtils.getCurrentSession();
            Transaction transaction = session.beginTransaction();
            // 简单查询
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            // 1. 获取CriteriaQuery对象
            CriteriaQuery<Customer> createQuery = criteriaBuilder.createQuery(Customer.class);
            // 2. 指定根条件
            createQuery.from(Customer.class);
            // 3. 通过session执行查询
            List<Customer> list = session.createQuery(createQuery).list();
            for (Customer customer : list) {
                System.out.println(customer);
            }
    
            transaction.commit();
        }
    }
    
    

    调用entityManager.getCriteriaBuilder()来获取CriteriaBuilder。CriteriaBuilder可以用于创建CriteriaQuery、CriteriaUpdate和CriteriaDelete。

    除此之外类似count、max等函数也是由CriteriaBuilder来创建的。其中Entitymanager可以使用@PersistenceContext注解来进行注入。
    调用criteriaBuilder.createQuery来创建CriteriaQuery。其中createQuery的参数是Query返回值类型。

    调用query.from(Order.class)。参数是对应于order表的实体类,query.from类似于sql中的from语句,该方法的执行等价于sql中的from order。

    调用 query.select创建映射。 query.select(criteriaBuilder.count(root.get(“id”)))等价于select count(id)。如果执行query.select(root)则等价于select *。

    使用CriteriaBuilder构造查询条件Predicate,该predicate也就是在where后面的条件子句。
    将Predicate放在 query.where中。
    最后执行查询获取数据。

    3.0 排序查询
        @Test
        /**
         * 
         * @Title: demo2
         * @Description: 排序查询
         * @param 
         * @return void
         * @throws
         *
         */
        public void demo2() {
            Session session = HibernateUtils.getCurrentSession();
            Transaction transaction = session.beginTransaction();
            
            //排序查询
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            // 1. 获取CriteriaQuery对象
            CriteriaQuery<Customer> createQuery = criteriaBuilder.createQuery(Customer.class);
             //2. 指定根条件,获得实体的查询根对象
             Root<Customer> root = createQuery.from(Customer.class);
             //降序排序 
             createQuery.select(root);
    //        Order order = criteriaBuilder.desc(from.get("cust_id"));
    //        createQuery.orderBy(order);
             createQuery.orderBy(criteriaBuilder.desc(root.get("cust_id")));
             //4. 将查询条件设置到where方法中
             //5. 通过session执行查询
             List<Customer> list = session.createQuery(createQuery).list();
            for (Customer customer : list) {
                System.out.println(customer);
            }
        }
    
    4.0 分页查询
        @Test
        /**
         * 
         * @Title: demo3
         * @Description: 分页查询
         * @param
         * @return void
         * @throws
         *
         */
        public void demo3() {
            Session session = HibernateUtils.getCurrentSession();
            Transaction transaction = session.beginTransaction();
    
            // 排序查询
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            // 1. 获取CriteriaQuery对象
            CriteriaQuery<LinkMan> createQuery = criteriaBuilder.createQuery(LinkMan.class);
            // 方法1:
    // int pageIndex = 11;
    // int pageSize = 10;
    // List<Customer> list =
    // session.createQuery(createQuery).setFirstResult(pageIndex).setMaxResults(pageSize).list();
    // 方法2
            // 要查询对象的实体,可以理解为需要查询的表
            Root<LinkMan> root = createQuery.from(LinkMan.class);
    
            TypedQuery<LinkMan> typedQuery = session.createQuery(createQuery);
            int pageIndex = 11;
            int pageSize = 10;
            // 设置分页
            typedQuery.setFirstResult(pageIndex);
            typedQuery.setMaxResults(pageSize);
    
            List<LinkMan> list = typedQuery.getResultList();
            for (LinkMan linkMan : list) {
                System.out.println(linkMan);
            }
    
            transaction.commit();
        }
    
    5.0 条件查询
    CriteriaBuilder 中各个方法的对应 
    
    equle : filed = value 
    gt / greaterThan : filed > value 
    lt / lessThan : filed = value 
    le / lessThanOrEqualTo: filed <= value 
    notEqule : filed != value 
    like : filed like value 
    notLike : filed not like value
    

    简单举例:

    
        @Test
        /**
         * 
         * @Title: demo4
         * @Description: 条件查询
         * @param
         * @return void
         * @throws
         *
         */
        public void demo4() {
            Session session = HibernateUtils.getCurrentSession();
            Transaction transaction = session.beginTransaction();
    
            // 排序查询
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            // 1. 获取CriteriaQuery对象
            CriteriaQuery<Customer> createQuery = criteriaBuilder.createQuery(Customer.class);
            // 查询客户的来源是小广告的
            Root<Customer> root = createQuery.from(Customer.class);
            Predicate predicate1 = criteriaBuilder.equal(root.get("cust_source"), "小广告");
            //将查询条件设置到where方法中,可以设置多个条件
            // criteria.where(criteriaBuilder.and(predicate1, predicate2));
            createQuery.where(criteriaBuilder.and(predicate1));
    
            List<Customer> list = session.createQuery(createQuery).list();
            for (Customer customer : list) {
                System.out.println(customer);
            }
            transaction.commit();
        }
    

    各种条件组合:

    
        @Test
        /**
         * 
         * @Title: demo4
         * @Description: 条件查询
         * @param
         * @return void
         * @throws
         *
         */
        public void demo4() {
            Session session = HibernateUtils.getCurrentSession();
            Transaction transaction = session.beginTransaction();
    
            // 条件查询
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            // 1. 获取CriteriaQuery对象
            CriteriaQuery<Customer> createQuery = criteriaBuilder.createQuery(Customer.class);
            // 查询客户的来源是小广告的
            Root<Customer> root = createQuery.from(Customer.class);
    
            /**
             * = eq
             * > gt
             * >= ge
             * < lt
             * <= le
             * <> notEqual(不等于)
             *相似 like 
             * where后面不同的取值 in
             * 和 and
             *  或 or
             */
            Predicate predicate1 = criteriaBuilder.equal(root.get("cust_source"), "小广告");
    //      Predicate predicate2 = criteriaBuilder.gt(root.get("cust_id"), 2);
    //      Predicate predicate3 = criteriaBuilder.ge(root.get("cust_id"), 2);
    //      Predicate predicate4 = criteriaBuilder.lt(root.get("cust_id"), 2);
    //      Predicate predicate5 = criteriaBuilder.le(root.get("cust_id"), 2);
    //      Predicate predicate6 = criteriaBuilder.notEqual(root.get("cust_id"), 2);
    //      Predicate predicate7 = criteriaBuilder.like(root.get("cust_source"), "小%");
    //      Path<Object> path = root.get("cust_id");
    //      Predicate predicate8 = criteriaBuilder.in(path);
    //      Predicate predicate9 = criteriaBuilder.and(predicate1);
    //      Predicate predicate10 = criteriaBuilder.or(predicate1);
    
            // 将查询条件设置到where方法中,可以设置多个条件
            //还可以这样搭配:criteria.where(criteriaBuilder.or(criteriaBuilder.and(predicate1, predicate2), predicate3));
            // criteria.where(criteriaBuilder.and(predicate1, predicate2));
            createQuery.where(criteriaBuilder.and(predicate7));
            List<Customer> list = session.createQuery(createQuery).list();
            for (Customer customer : list) {
                System.out.println(customer);
            }
            transaction.commit();
        }
    
    
    6.0 统计查询
        @Test
        /**
         * 
         * @Title: demo5
         * @Description: 统计查询
         * @param
         * @return void
         * @throws
         *
         */
        public void demo5() {
            Session session = HibernateUtils.getCurrentSession();
            Transaction transaction = session.beginTransaction();
            //统计查询习惯性使用HQL,不习惯QBC方式
            // 统计查询,查询表中有多少条数据
            CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
            // 1. 获取CriteriaQuery对象
            CriteriaQuery<Long> createQuery = criteriaBuilder.createQuery(Long.class);
            Root<LinkMan> root = createQuery.from(LinkMan.class);
            /**
             * add :普通的条件,where后面的条件
             * addOrder :排序
             * setProject :聚合函数和group by having
             * 
             */
            createQuery.select(criteriaBuilder.count(root));
            // 唯一的结果uniqueResult()方法
            Long  count =   session.createQuery(createQuery).uniqueResult();
              System.out.println("总数为:"+count);
            transaction.commit();
        }
    
    7.0 离线条件查询(SSH整合之后经常使用此查询)

    全称: DetachedCriteria
    更适合做综合条件查询。
    离线脱离session使用。

    
        @Test
        /**
         * 
         * @Title: demo6
         * @Description: 离线条件查询
         * @param
         * @return void
         * @throws
         *
         */
        public void demo6() {
            // web层
            DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
            detachedCriteria.add(Restrictions.like("cust_name", "李%"));
    
            // DAO中
            Session session = HibernateUtils.getCurrentSession();
            Transaction transaction = session.beginTransaction();
    
            // 获得一个可执行的Criteria:getExecutableCriteria()
            Criteria criteria = detachedCriteria.getExecutableCriteria(session);
    
            List<Customer> list = criteria.list();
            for (Customer customer : list) {
                System.out.println(customer);
            }
            transaction.commit();
        }
    

    END

    相关文章

      网友评论

        本文标题:【Java中级】12.0 SSH之Hibernate框架(九)—

        本文链接:https://www.haomeiwen.com/subject/kbdnxhtx.html