Hibernate框架笔记04HQL_QBC查询详解_抓取策略优化机制

时间:2019-04-25 19:30:49   收藏:0   阅读:107

技术分享图片

1. Hibernate的查询方式

1.1 方式一:OID查询

1.2 方式二:对象导航查询

1.3 方式三:HQL方式

1.4 方式四:QBC查询

1.5 方式五:SQL查询

2. 环境搭建

3. HQL查询

3.1 简单查询

@Test
    public void test2() {//HQL的简单查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        // 简单查询
        Query query = session.createQuery("from Customer");
        List<Customer> list = query.list();
        
        // sql中支持*号的写法:select * from cst_customer;但是在HQL中不支持*号的写法。
//      Query query2 = session.createQuery("select * from from Customer");// 报错
//      List<Customer> list2 = query.list();
        
        for (Customer customer : list) {
            System.out.println(customer);
            
        }
        transaction.commit();
    }

3.2 别名查询

@Test
    public void test3() {// 别名查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        // 别名查询
//      Query query = session.createQuery("from Customer c");
//      List<Customer> list = query.list();
        
        Query query = session.createQuery("select c from Customer c");
        List<Customer> list = query.list();
        
        for (Customer customer : list) {
            System.out.println(customer);
            
        }
        transaction.commit();
    }

3.3 排序查询

@Test
    public void test5() {// 排序查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        // 排序查询
        // 默认情况
        //List<Customer> list = session.createQuery("from Customer order by cust_id").list();
        
        // 设置兼降序排序       升序使用asc 降序使用desc
        List<Customer> list = session.createQuery("from Customer order by cust_id desc").list();
        
        
        
        for (Customer customer : list) {
            System.out.println(customer);
            
        }
        transaction.commit();
    }

3.4 条件查询

@Test
    public void test4() {// 排序查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        // 排序查询
        // 1. 按位置绑定:根据参数的位置进行绑定
        // 一个条件
//      Query query = session.createQuery("from Customer where cust_name = ?");
//      query.setParameter(0, "朱元璋");
        
        // 多个条件
//      Query query = session.createQuery("from Customer where cust_source = ? and cust_name like ?");
//      query.setParameter(0, "朋友推荐");
//      query.setParameter(1, "朱%");
        
        // 2. 按名称绑定
        Query query = session.createQuery("from Customer where cust_source = :aaa and cust_name like :bbb");
        // 设置参数:
        query.setParameter("aaa", "朋友推荐");
        query.setParameter("bbb", "朱%");
        List<Customer> list = query.list();
        
        for (Customer customer : list) {
            System.out.println(customer);
            
        }
        transaction.commit();
    }

3.4 投影查询

@Test
    public void test6() {// 投影查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        // 投影查询
        // 单个属性
//      List<Object> list = session.createQuery("select c.cust_name from Customer c").list();
//      for (Object customer : list) {
//          System.out.println(customer);
//          
//      }
        
        // 多个属性:
//      List<Object[]> list = session.createQuery("select c.cust_name,c.cust_source from Customer c").list();
//      for (Object[] objects : list) {
//          System.out.println(Arrays.toString(objects));
//      }
        
        // 查询多个属性,但我想封装到对象中-----需要这两个参数的构造函数
        List<Object[]> list = session.createQuery("select c.cust_name,c.cust_source from Customer c").list();
        for (Object[] customer : list) {
            System.out.println(Arrays.toString(customer));
        }
        
        transaction.commit();
    }

3.5 分页查询

@Test
    public void test7() {// 分页查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        // 分页查询
        Query query = session.createQuery("from LinkMan");
        query.setFirstResult(20);
        query.setMaxResults(5);
        List<LinkMan> list = query.list();
        for (LinkMan linkMan : list) {
            System.out.println(linkMan);
        }
        
        transaction.commit();
    }

3.6 分组统计查询

@Test
    public void test8() {// 分组统计查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        // 分组统计查询
        Object object = session.createQuery("select count(*) from Customer").uniqueResult();
        System.out.println(object);
        
        //分组统计:
        Query query = session.createQuery("select cust_source,count(*) from Customer group by cust_source");
        List<Object[]> list = query.list();
        for (Object[] objects : list) {
            System.out.println(Arrays.toString(objects));
        }
        transaction.commit();
    }

3.7 HQL的多表查询

3.7.1 SQL的多表查询

3.7.2 HQL的多表查询

@Test
    public void test7() { // 多表查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        
        // SQL:select * from cst_customer c inner join cst_linkman l on c.cust_id = l.lkm_cust_id
        // HQL:内连接from Customer c inner join c.linkMans
        // 内连接得到的是一个数组
        
//      List<Object[]> list = session.createQuery("from Customer c inner join c.linkMans").list();
//      for (Object[] objects : list) {
//          System.out.println(Arrays.toString(objects));
//      }
        
        // HQL:迫切内连接,其实就是在普通的内连接inner join后添加一个关键字fetch.
        // 迫切内连接的到的是一个对象,在Customer的toString中给定LinkMans可以得到全部字段
        List<Customer> list2 = session.createQuery("select distinct c from Customer c inner join fetch c.linkMans").list();
        for (Customer customer : list2) {
            System.out.println(customer);
        }
        
        transaction.commit();
    }

4. QBC查询

4.1 简单查询

@Test
    public void test1() { // 简单查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        //获得Criteria的对象
        Criteria criteria = session.createCriteria(Customer.class);
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        
        transaction.commit();
    }

4.2 排序查询

@Test
    public void test2() { // 排序查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        //获得Criteria的对象
        Criteria criteria = session.createCriteria(Customer.class);
//      criteria.addOrder(Order.desc("cust_id"));   // 降序
        criteria.addOrder(Order.asc("cust_id"));    // 升序
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        
        transaction.commit();
    }

4.3 分页查询

@Test
    public void test3() { // 分页查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        //获得Criteria的对象
        Criteria criteria = session.createCriteria(LinkMan.class);
        criteria.setFirstResult(20);
        criteria.setMaxResults(5);
        
        List<LinkMan> list = criteria.list();
        for (LinkMan linkMan : list) {
            System.out.println(linkMan);
        }
        
        transaction.commit();
    }

4.4 条件查询

@Test
    public void test4() { // 条件查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        //获得Criteria的对象
        Criteria criteria = session.createCriteria(Customer.class);
        // 设置条件
        /*
         *  =       eq
         *  >       gt
         *  >=      ge
         *  <       lt
         *  <=      le
         *  <>      ne
         *  like
         *  in
         *  and
         *  or
         */
        criteria.add(Restrictions.eq("cust_source", "小广告"));
        criteria.add(Restrictions.like("cust_name", "李%"));
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        
        transaction.commit();
    }

4.5 统计查询

@Test
    public void test5() { // 条件查询
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        //获得Criteria的对象
        Criteria criteria = session.createCriteria(Customer.class);
        /**
         *  add     :普通的条件。where后面条件
         *  addOrder:排序
         *  setProjecttion:聚合函数和group by having
         */
        
        criteria.setProjection(Projections.rowCount());
        Long num = (Long) criteria.uniqueResult();
        System.out.println(num);
        
        transaction.commit();
    }

4.6 离线条件查询(***)DetachedCriteria

@Test
    public void test6() { // 离线条件查询
        DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
        detachedCriteria.add(Restrictions.like("cust_name", "李%"));
        
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        Criteria criteria = detachedCriteria.getExecutableCriteria(session);
        List<Customer> list = criteria.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        
        transaction.commit();
    }

5. SQL查询


    @Test
    public void test1() {
        Session session = HibernateUtils.getCurrentSession();
        Transaction transaction = session.beginTransaction();
        
        // 调用的createSQLQuery,返回的值遍历后是数组形式的集合
//      SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
//      List<Object[]> list = sqlQuery.list();
//      for (Object[] objects : list) {
//          System.out.println(Arrays.toString(objects));
//      }
        
        SQLQuery sqlQuery = session.createSQLQuery("select * from cst_customer");
        sqlQuery.addEntity(Customer.class); //封装到实体Customer中
        List<Customer> list = sqlQuery.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        
        transaction.commit();
    }

6. Hibernate的抓取策略

6.1 延迟加载的概述

6.1.1 什么是延迟加载

6.1.2 延迟加载的分类

6.2 抓取策略

Customer.hbm.xml

<set name="linkMans" fetch="select" lazy="true">
    <!-- column多的一方的外键的名称 -->
    <key column="lkm_cust_id"></key>
    <!-- class:多的一方的类的全限定名 -->
    <one-to-many class="com.itzhouq.hibernate.domain.LinkMan"/>
</set>

6.2.1 抓取策略概述

6.2.2 set上的fetch和lazy

6.2.3 many-to-one上的fetch和lazy

6.2.4 批量抓取

原文:https://www.cnblogs.com/itzhouq/p/hibernate04.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!