Android开发Android开发经验谈Java

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

2020-02-11  本文已影响0人  bobokaka

本篇内容源代码:
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

上一篇下一篇

猜你喜欢

热点阅读