zoukankan      html  css  js  c++  java
  • Hibernate第四天:Hibernate的查询方式、抓取策略

    目录

    1Hibernate的查询的方式

    1.1Hibernate的查询方式:OID查询

    1.1.1使用get方法

    1.1.2使用load方法

    1.2Hibernate的查询方式:对象导航检索

    1.3Hibernate的查询方式:HQL检索

    1.3.1初始化一些数据

    1.3.2HQL的简单查询

    1.3.3HQL的别名查询

    1.3.4HQL的排序查询

    1.3.5HQL的条件查询

    1.3.6HQL的投影查询

    1.3.7HQL的分页查询

    1.3.8HQL的分组统计查询

    1.3.9HQL的多表查询

    1.4Hibernate的查询方式:QBC检索

    1.4.1简单查询

    1.4.2排序查询

    1.4.3分页查询

    1.4.4条件查询

    1.4.5统计查询

    1.4.6离线条件查询(SSH)---DetachedCriteria

    1.5Hibernate的查询方式:SQL检索

    2Hibernate的抓取策略(优化)

    2.1延迟加载的概述

    2.1.1什么是延迟加载

    2.1.2延迟加载的分类

    2.2抓取策略

    2.2.1抓取策略的概述

    2.2.2上的fetch和lazy

    2.2.3上的fetch和lazy

    2.3批量抓取

    2.3.1什么是批量抓取

    2.3.2测试批量抓取


     

    1Hibernate的查询的方式

    在Hibernate中提供了很多种的查询的方式。Hibernate共提供了五种查询方式。

    1.1Hibernate的查询方式:OID查询

    OID检索:Hibernate根据对象的OID(主键)进行检索。

    1.1.1使用get方法

    Customer customer = session.get(Customer.class,1l);

    1.1.2使用load方法

    Customer customer = session.load(Customer.class,1l);

    1.2Hibernate的查询方式:对象导航检索

    对象导航检索:Hibernate根据一个已经查询到的对象,获得其关联的对象的一种查询方式。

    LinkMan linkMan = session.get(LinkMan.class,1l);

    Customer customer  = linkMan.getCustomer();

     

    Customer customer = session.get(Customer.class,2l);

    Set<LinkMan> linkMans = customer.getLinkMans();

    1.3Hibernate的查询方式:HQL检索

    HQL查询:Hibernate Query Language,Hibernate的查询语言,是一种面向对象的方式的查询语言,语法类似SQL。通过session.createQuery(),用于接收一个HQL进行查询方式。

    1.3.1初始化一些数据

     


     

    @Test
    
        /**
    
         * 初始化数据
    
         */
    
        public void demo1() {
    
            Session session = HibernateUtils.getCurrentSession();
    
            Transaction tx = session.beginTransaction();
    
    
    
            // 创建一个客户
    
            Customer customer = new Customer();
    
            customer.setCust_name("张帅");
    
    
    
            for (int i = 1; i <= 10; i++) {
    
                LinkMan linkMan = new LinkMan();
    
                linkMan.setLkm_name("王晓丹" + i);
    
                linkMan.setCustomer(customer);
    
    
    
                customer.getLinkMans().add(linkMan);
    
    
    
                session.save(linkMan);
    
            }
    
            session.save(customer);
    
    
    
            tx.commit();
    
        }
    
    

    1.3.2HQL的简单查询


     

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

    1.3.3HQL的别名查询

    
    @Test
    
        /**
    
         * 别名查询
    
         */
    
        public void demo3() {
    
            Session session = HibernateUtils.getCurrentSession();
    
            Transaction tx = 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);
    
            }
    
            tx.commit();
    
        }
    
    
    
    

    1.3.4HQL的排序查询

    @Test
    
        /**
    
         * 排序查询
    
         */
    
        public void demo4() {
    
            Session session = HibernateUtils.getCurrentSession();
    
            Transaction tx = 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);
    
            }
    
            tx.commit();
    
        }
    
    
    
    

    1.3.5HQL的条件查询

    
    @Test
    
        /**
    
         * 条件查询
    
         */
    
        public void demo5() {
    
            Session session = HibernateUtils.getCurrentSession();
    
            Transaction tx = session.beginTransaction();
    
            // 条件的查询
    
            // 一、按位置绑定:根据参数的位置进行绑定。
    
            // 一个条件
    
            /*
    
             * Query query = session.createQuery("from Customer where cust_name = ?"
    
             * ); query.setParameter(0, "李兵"); List<Customer> list = query.list();
    
             */
    
    
    
            // 多个条件
    
            /*
    
             * Query query = session.createQuery(
    
             * "from Customer where cust_source = ? and cust_name like ?");
    
             * query.setParameter(0, "小广告"); query.setParameter(1, "李%");
    
             * List<Customer> list = query.list();
    
             */
    
    
    
            // 二、按名称绑定
    
            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);
    
            }
    
            tx.commit();
    
        }
    
    

    1.3.6HQL的投影查询

    投影查询:查询对象的某个或某些属性。

    
         @Test
    
         /**
    
          * 投影查询
    
          */
    
         public void demo6() {
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
    
    
             // 投影查询
    
             // 单个属性
    
             /*
    
              * List<Object> list = session.createQuery(
    
              * "select c.cust_name from Customer c").list(); for (Object object :
    
              * list) { System.out.println(object); }
    
              */
    
    
    
             // 多个属性:
    
             /*
    
              * 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<Customer> list = session.createQuery("select new Customer(cust_name,cust_source) from Customer").list();
    
             for (Customer customer : list) {
    
                  System.out.println(customer);
    
             }
    
             tx.commit();
    
         }
    
    
    
    
    
    

    1.3.7HQL的分页查询

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

    1.3.8HQL的分组统计查询

    
    @Test
    
         /**
    
          * 分组统计查询
    
          */
    
         public void demo8() {
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
    
    
             // 聚合函数的使用:count(),max(),min(),avg(),sum()
    
             Object object = session.createQuery("select count(*) from Customer").uniqueResult();
    
             System.out.println(object);
    
             // 分组统计:
    
             List<Object[]> list = session.createQuery("select cust_source,count(*) from Customer group by cust_source").list();
    
             for (Object[] objects : list) {
    
                  System.out.println(Arrays.toString(objects));
    
             }
    
             tx.commit();
    
         }
    
    
    
    
    
    

    1.3.9HQL的多表查询

    1. SQL的多表查询
      1. 连接查询
        1. 交叉连接:笛卡尔积

    select * from A,B;

        1. 内连接     :inner join (inner 可以省略)
          1. 隐式内连接:

    select * from A,B where A.id = B.aid;

          1. 显示内连接:

    select * from A inner join B on A.id = B.aid;

        1.  外连接  :
          1. 左外连接:left outer join(outer 可以省略)

    select * from A left outer join B on A.id= B.aid;

          1. 右外连接:right outer join(outer 可以省略)

    select * from A right outer join B on A.id = B.aid;

      1. 子查询

     

    1. HQL的多表查询
      1. 连接查询
        1. 交叉连接
        2. 内连接
          1. 显示内连接
          2. 隐式内连接
          3. 迫切内连接
        3. 外连接
          1. 左外连接
          2. 右外连接
          3. 迫切左外连接


     

    @Test
    
         /**
    
          * HQL的多表查询
    
          */
    
         public void demo9() {
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = 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. from Customer c inner
    
             // join fetch c.linkMans
    
             List<Customer> list = session.createQuery("select distinct c from Customer c inner join fetch c.linkMans").list();// 通知hibernate,将另一个对象的数据封装到该对象中
    
    
    
             for (Customer customer : list) {
    
                  System.out.println(customer);
    
             }
    
             tx.commit();
    
         }
    
    
    
    
    
    

    1.4Hibernate的查询方式:QBC检索

    QBC查询:Query By Criteria,条件查询。是一种更加面向对象化的查询的方式。

    1.4.1简单查询


     

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

    1.4.2排序查询


     

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

    1.4.3分页查询

     

    @Test
    
         /**
    
          * 分页查询
    
          */
    
         public void demo3(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             // 分页查询
    
             Criteria criteria = session.createCriteria(LinkMan.class);
    
             criteria.setFirstResult(10);
    
             criteria.setMaxResults(10);
    
             List<LinkMan> list = criteria.list();
    
            
    
             for (LinkMan linkMan : list) {
    
                  System.out.println(linkMan);
    
             }
    
             tx.commit();
    
         }

    1.4.4条件查询

    
    @Test
    
         /**
    
          * 条件查询
    
          */
    
         public void demo4(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             // 条件查询
    
             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.or(Restrictions.like("cust_name", "李%")));
    
             criteria.add(Restrictions.like("cust_name", "李%"));
    
             List<Customer> list = criteria.list();
    
             for (Customer customer : list) {
    
                  System.out.println(customer);
    
             }
    
             tx.commit();
    
         }
    
     
    
    

    1.4.5统计查询


     

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

    1.4.6离线条件查询(SSH)---DetachedCriteria

     

    @Test
    
         /**
    
          * 离线条件查询
    
          */
    
         public void demo6(){
    
             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();
    
         }

     

     

    1.5Hibernate的查询方式:SQL检索

    SQL查询

    SQL查询:通过使用sql语句进行查询


     

    package top.yangxianyang.demo1;
    
    
    
    import java.util.Arrays;
    
    import java.util.List;
    
    
    
    import org.hibernate.SQLQuery;
    
    import org.hibernate.Session;
    
    import org.hibernate.Transaction;
    
    import org.junit.Test;
    
    
    
    import top.yangxianyang.entity.Customer;
    
    import top.yangxianyang.utils.HibernateUtils;
    
    
    
    
    
    /**
    
     * SQL查询
    
     * @author yxy
    
     *
    
     */
    
    public class HibernateTest3 {
    
    
    
         @Test
    
         public void demo1(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             /*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);
    
             List<Customer> list = sqlQuery.list();
    
             for (Customer customer : list) {
    
                  System.out.println(customer);
    
             }
    
             tx.commit();
    
         }
    
    }
    
    

     

    2Hibernate的抓取策略(优化)

    2.1延迟加载的概述

    2.1.1什么是延迟加载

    延迟加载:lazy(懒加载)。执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。

    2.1.2延迟加载的分类

    1. 类级别的延迟加载
      1. 指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);
      2. 类级别延迟加载通过<class>上的lazy进行配置,如果让lazy失效
        1. 将lazy设置为false
        2. 将持久化类使用final修饰
        3. Hibernate. Initialize()


     

    package top.yangxianyang.demo1;
    
    
    
    import org.hibernate.Hibernate;
    
    import org.hibernate.Session;
    
    import org.hibernate.Transaction;
    
    import org.junit.Test;
    
    
    
    import top.yangxianyang.entity.Customer;
    
    import top.yangxianyang.utils.HibernateUtils;
    
    
    
    
    
    /**
    
     * Hibernate的延迟加载
    
     * @author yxy
    
     *
    
     */
    
    public class HibernateTest4 {
    
    
    
         @Test
    
         /**
    
          * 类级别的延迟加载
    
          * * 在<class>的标签上配置的lazy
    
          */
    
         public void demo1(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             Customer customer = session.load(Customer.class, 1l);
    
             Hibernate.initialize(customer);
    
             System.out.println(customer);
    
            
    
             tx.commit();
    
         }
    
    }
    
    
    1. 关联级别的延迟加载
      1. 指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。

    Customer customer = session.get(Customer.class,1l);

    customer.getLinkMans();----通过客户获得联系人的时候,联系人对象是否采用了延迟加载,称为是关联级别的延迟。

      1. 抓取策略往往会和关联级别的延迟加载一起使用,优化语句。

    2.2抓取策略

    2.2.1抓取策略的概述

    1. 通过一个对象抓取到关联对象需要发送SQL语句,SQL语句如何发送,发送成什么样格式通过策略进行配置。
      1. 通 过<set>或者<many-to-one>上通过fetch属性进行设置
      2. fetch和这些标签上的lazy如何设置优化发送的SQL语句

    2.2.2<set>上的fetch和lazy

    1. fetch:抓取策略,控制SQL语句格式
      1. select                 :默认值,发送普通的select语句,查询关联对象
      2. join                     :发送一条迫切左外连接查询关联对象
      3. subselect          :发送一条子查询查询其关联对象
    2. lazy:延迟加载,控制查询关联对象的时候是否采用延迟
      1. true                    :默认值,查询关联对象的时候,采用延迟加载
      2. false                            :查询关联对象的时候,不采用延迟加载
      3. extra                  :及其懒惰。
    3. 在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join


     

    package top.yangxianyang.demo1;
    
    
    
    import java.util.List;
    
    
    
    import org.hibernate.Session;
    
    import org.hibernate.Transaction;
    
    import org.junit.Test;
    
    
    
    import top.yangxianyang.entity.Customer;
    
    import top.yangxianyang.entity.LinkMan;
    
    import top.yangxianyang.utils.HibernateUtils;
    
    
    
    
    
    /**
    
     * 在<set>上的fetch和lazy
    
     * @author yxy
    
     *
    
     */
    
    public class HibernateTest5 {
    
    
    
         @Test
    
         /**
    
          * 默认情况:
    
          */
    
         public void demo1(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             // 查询1号客户
    
             Customer customer = session.get(Customer.class, 1l);// 发送一条查询客户的SQL
    
             System.out.println(customer.getCust_name());
    
             // 查看1号客户的每个联系人的信息
    
             for (LinkMan linkMan : customer.getLinkMans()) {// 发送一条根据客户ID查询联系人的SQL
    
                  System.out.println(linkMan.getLkm_name());
    
             }
    
             tx.commit();
    
         }
    
        
    
         @Test
    
         /**
    
          * 设置fetch="select" lazy="true"
    
          */
    
         public void demo2(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             // 查询1号客户
    
             Customer customer = session.get(Customer.class, 1l);// 发送一条查询客户的SQL
    
             System.out.println(customer.getCust_name());
    
             // 查看1号客户的每个联系人的信息
    
             for (LinkMan linkMan : customer.getLinkMans()) {// 发送一条根据客户ID查询联系人的SQL
    
                  System.out.println(linkMan.getLkm_name());
    
             }
    
             tx.commit();
    
         }
    
        
    
         @Test
    
         /**
    
          * 设置  fetch="select" lazy="false"
    
          */
    
         public void demo3(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             // 查询1号客户
    
             Customer customer = session.get(Customer.class, 1l);// 发送两条SQL语句:查询客户的名称,查询客户关联联系人
    
             System.out.println(customer.getCust_name());
    
             /*// 查看1号客户的每个联系人的信息
    
             for (LinkMan linkMan : customer.getLinkMans()) {//
    
                  System.out.println(linkMan.getLkm_name());
    
             }*/
    
            
    
             System.out.println(customer.getLinkMans().size());
    
             tx.commit();
    
         }
    
        
    
         @Test
    
         /**
    
          * 设置fetch="select" lazy="extra"
    
          */
    
         public void demo4(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             // 查询1号客户
    
             Customer customer = session.get(Customer.class, 1l);// 发送一条查询1号客户的SQL语句
    
             System.out.println(customer.getCust_name());
    
            
    
             System.out.println(customer.getLinkMans().size());// 发送一条select count() from ...;
    
             tx.commit();
    
         }
    
        
    
         @Test
    
         /**
    
          * 设置fetch="join" lazy=失效
    
          */
    
         public void demo5(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             // 查询1号客户
    
             Customer customer = session.get(Customer.class, 1l);// 发送一条迫切左外连接查询记录
    
             System.out.println(customer.getCust_name());
    
            
    
             System.out.println(customer.getLinkMans().size());// 不发送
    
             tx.commit();
    
         }
    
        
    
         @SuppressWarnings("unchecked")
    
         @Test
    
         /**
    
          * 设置fetch="subselect" lazy="true"
    
          */
    
         public void demo6(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             List<Customer> list = session.createQuery("from Customer").list();// 发送查询所有客户的SQL
    
             for (Customer customer : list) {
    
                  System.out.println(customer.getCust_name());
    
                  System.out.println(customer.getLinkMans().size());// 发送一条子查询
    
             }
    
            
    
             tx.commit();
    
         }
    
        
    
         @SuppressWarnings("unchecked")
    
         @Test
    
         /**
    
          * 设置fetch="subselect" lazy="false"
    
          */
    
         public void demo7(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             List<Customer> list = session.createQuery("from Customer").list();// 发送查询所有客户的SQL,发送一条子查询
    
             for (Customer customer : list) {
    
                  System.out.println(customer.getCust_name());
    
                  System.out.println(customer.getLinkMans().size());//
    
             }
    
            
    
             tx.commit();
    
         }
    
    }
    

    2.2.3<many-to-one>上的fetch和lazy

    1. fetch :抓取策略,控制SQL语句格式。
      1. select       :默认值,发送普通的select语句,查询关联对象。
      2. join            :发送一条迫切左外连接。
    2. lazy   :延迟加载,控制查询关联对象的时候是否采用延迟。
      1. proxy        :默认值,proxy具体的取值,取决于另一端的<class>上的lazy的值。
      2. false                   :查询关联对象,不采用延迟。
      3. no-proxy  :(不会使用)
    3. 在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join


     

    package top.yangxianyang.demo1;
    
    
    
    import org.hibernate.Session;
    
    import org.hibernate.Transaction;
    
    import org.junit.Test;
    
    
    
    import top.yangxianyang.entity.LinkMan;
    
    import top.yangxianyang.utils.HibernateUtils;
    
    
    
    
    
    /**
    
     * many-to-one上的fetch和lazy测试
    
     * @author yxy
    
     *
    
     */
    
    public class HibernateTest6 {
    
    
    
         @Test
    
         /**
    
          * 默认值
    
          */
    
         public void demo1(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             LinkMan linkMan = session.get(LinkMan.class, 1l);// 发送一条查询联系人语句
    
             System.out.println(linkMan.getLkm_name());
    
             System.out.println(linkMan.getCustomer().getCust_name());// 发送一条select语句查询联系人所关联的客户
    
            
    
             tx.commit();
    
         }
    
        
    
         @Test
    
         /**
    
          * fetch="select" lazy="proxy"
    
          */
    
         public void demo2(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             LinkMan linkMan = session.get(LinkMan.class, 1l);// 发送一条查询联系人语句
    
             System.out.println(linkMan.getLkm_name());
    
             System.out.println(linkMan.getCustomer().getCust_name());// 发送一条select语句查询联系人所关联的客户
    
            
    
             tx.commit();
    
         }
    
        
    
         @Test
    
         /**
    
          * fetch="select" lazy="false"
    
          */
    
         public void demo3(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             LinkMan linkMan = session.get(LinkMan.class, 1l);// 发送一条查询联系人语句,发送一条select语句查询联系人所关联的客户
    
             System.out.println(linkMan.getLkm_name());
    
             System.out.println(linkMan.getCustomer().getCust_name());//
    
            
    
             tx.commit();
    
         }
    
        
    
         @Test
    
         /**
    
          * fetch="join" lazy=失效
    
          */
    
         public void demo4(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             LinkMan linkMan = session.get(LinkMan.class, 1l);// 发送一条迫切左外连接查询联系人所关联的客户。
    
             System.out.println(linkMan.getLkm_name());
    
             System.out.println(linkMan.getCustomer().getCust_name());//
    
            
    
             tx.commit();
    
         }
    
    }
    

    2.3批量抓取

    2.3.1什么是批量抓取

    一批关联对象一起抓取,batch-size

    2.3.2测试批量抓取

    
    package top.yangxianyang.demo1;
    
    
    
    import java.util.List;
    
    
    
    import org.hibernate.Session;
    
    import org.hibernate.Transaction;
    
    import org.junit.Test;
    
    
    
    import top.yangxianyang.entity.Customer;
    
    import top.yangxianyang.entity.LinkMan;
    
    import top.yangxianyang.utils.HibernateUtils;
    
    
    
    
    
    /**
    
     * 批量抓取
    
     * @author yxy
    
     *
    
     */
    
    public class HibernateTest7 {
    
    
    
         @SuppressWarnings("unchecked")
    
         @Test
    
         /**
    
          * 获取客户的时候,批量抓取联系人
    
          * 在Customer.hbm.xml中set上配置batch-size
    
          */
    
         public void demo1(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             List<Customer> list = session.createQuery("from Customer").list();
    
             for (Customer customer : list) {
    
                  System.out.println(customer.getCust_name());
    
                  for (LinkMan linkMan : customer.getLinkMans()) {
    
                      System.out.println(linkMan.getLkm_name());
    
                  }
    
             }
    
             tx.commit();
    
         }
    
        
    
         @SuppressWarnings("unchecked")
    
         @Test
    
         /**
    
          * 获取联系人的时候,批量抓取客户
    
          * * 在Customer.hbm.xml中<class>上配置
    
          */
    
         public void demo2(){
    
             Session session = HibernateUtils.getCurrentSession();
    
             Transaction tx = session.beginTransaction();
    
            
    
             List<LinkMan> list = session.createQuery("from LinkMan").list();
    
             for (LinkMan linkMan : list) {
    
                  System.out.println(linkMan.getLkm_name());
    
                  System.out.println(linkMan.getCustomer().getCust_name());
    
             }
    
             tx.commit();
    
         }
    
    }
    
    

    源码链接:

           链接: https://pan.baidu.com/s/1FP2wVYkUJBjVqmHkGiP7og 提取码: aaeh

     

  • 相关阅读:
    ZOJ 1002 Fire Net
    Uva 12889 One-Two-Three
    URAL 1881 Long problem statement
    URAL 1880 Psych Up's Eigenvalues
    URAL 1877 Bicycle Codes
    URAL 1876 Centipede's Morning
    URAL 1873. GOV Chronicles
    Uva 839 Not so Mobile
    Uva 679 Dropping Balls
    An ac a day,keep wa away
  • 原文地址:https://www.cnblogs.com/yangxianyang/p/13675672.html
Copyright © 2011-2022 走看看