• Hibernate的查询方式


    Hibernate的查询的方式

        OID检索

          get或load方法进行的查询

        对象导航检索

          linkman.getCustomer();

        HQL检索

           用于接收hql语句进行查询,面向对象查询方式。

            通过session.createQuery(String hql);

              简单查询

     1 @Test
     2     public void fun1() {
     3         //获取session
     4         Session session = HibernateUtils.openSession();
     5         //打开事务
     6         Transaction tx=session.beginTransaction();
     7         //--------------------------------------
     8         //完整写法
     9         String hql1="from cn.itheima.domain.Customer";
    10         //简单写法
    11         String hql2="from Custom";
    12         //扩展写法
    13         //如果用这种写法对象是Object,接收对象List不用泛型
    14         String hql3="from java.lang.object";
    15         Query query = session.createQuery(hql1);
    16         
    17         List<Customer> list=query.list();
    18         
    19         System.out.println(list);
    20         //--------------------------------------
    21         //提交事务
    22         tx.commit();
    23         //关闭session
    24         session.close();    
    25         
    26     }
    View Code

              别名查询

             排序查询

     1 @Test
     2     //排序
     3     public void fun2() {
     4         //获取session
     5         Session session = HibernateUtils.openSession();
     6         //打开事务
     7         Transaction tx=session.beginTransaction();
     8         //--------------------------------------
     9         //完整写法
    10         String hql1="from cn.itheima.domain.Customer order by cust_id asc";
    11         String hql2="from cn.itheima.domain.Customer order by cust_id desc";
    12         Query query = session.createQuery(hql1);
    13         
    14         List<Customer> list=query.list();
    15         //query.setParameter("id", 2l);
    16         
    17         System.out.println(list);
    18         //--------------------------------------
    19         //提交事务
    20         tx.commit();
    21         //关闭session
    22         session.close();
    23         
    24     }
    View Code

             条件查询

             分组统计查询

             投影查询

     1 @Test
     2     //投影查询
     3     public void fun5() {
     4         //获取session
     5         Session session = HibernateUtils.openSession();
     6         //打开事务
     7         Transaction tx=session.beginTransaction();
     8         //--------------------------------------
     9         //完整写法
    10         String hql1="select cust_name from cn.itheima.domain.Customer ";
    11         String hql2="select cust_name,cust_id from cn.itheima.domain.Customer ";
    12         String hql3="select new Customer(cust_name,cust_id) from cn.itheima.domain.Customer ";
    13         
    14         Query query = session.createQuery(hql2); 
    15         
    16         List<Object[]> list = query.list();
    17         System.out.println(list);
    18         //--------------------------------------
    19         //提交事务
    20         tx.commit();
    21         //关闭session
    22         session.close();
    23     }
    View Code

                分页查询

     1 @Test
     2     //分页
     3     public void fun3() {
     4         //获取session
     5         Session session = HibernateUtils.openSession();
     6         //打开事务
     7         Transaction tx=session.beginTransaction();
     8         //--------------------------------------
     9         //完整写法
    10         String hql1="from cn.itheima.domain.Customer order by cust_id asc";
    11         String hql2="from cn.itheima.domain.Customer order by cust_id desc";
    12         Query query = session.createQuery(hql1);
    13         
    14         //(当前页数-1)*每页条数
    15         query.setFirstResult(0);
    16         query.setMaxResults(2);
    17         //query.setParameter("id", 2l);
    18         
    19         
    20         List<Customer> list=query.list();
    21         
    22         System.out.println(list);
    23         //--------------------------------------
    24         //提交事务
    25         tx.commit();
    26         //关闭session
    27         session.close();
    28     }
    View Code

             多表查询

        QBC检索

          用于进行条件查询(Query By Criteria),更加面向对象的方式。

          通过session.createCriteria(Class clazz);

     1 @Test
     2     //基本语法
     3     //注意此时生成ToString方法
     4     public void fun1() {
     5         //获取session
     6         Session session = HibernateUtils.openSession();
     7         //打开事务
     8         Transaction tx=session.beginTransaction();
     9         //--------------------------------------
    10         //完整写法
    11         Criteria c = session.createCriteria(Customer.class);
    12         
    13         List<Customer> list =c.list();
    14         System.out.println(list);
    15         
    16         
    17         //--------------------------------------
    18         //提交事务
    19         tx.commit();
    20         //关闭session
    21         session.close();
    22         
    23     }
    View Code

            简单查询

            排序查询

     1 @Test
     2     //排序语法
     3     public void fun4() {
     4         //获取session
     5         Session session = HibernateUtils.openSession();
     6         //打开事务
     7         Transaction tx=session.beginTransaction();
     8         //--------------------------------------
     9         //完整写法
    10         
    11         Criteria c = session.createCriteria(Customer.class);
    12         
    13         //c.addOrder(Order.asc("cust_id"));//升序
    14         c.addOrder(Order.desc("cust_id"));//降序
    15         
    16         
    17         List<Customer> list=c.list();
    18         System.out.println(list);
    19         
    20         //--------------------------------------
    21         //提交事务
    22         tx.commit();
    23         //关闭session
    24         session.close();
    25     }
    View Code

            分组统计查询

            分页查询

     1 @Test
     2     //分页语法-与HQL一样
     3     public void fun3() {
     4         //获取session
     5         Session session = HibernateUtils.openSession();
     6         //打开事务
     7         Transaction tx=session.beginTransaction();
     8         //--------------------------------------
     9         Criteria c=session.createCriteria(Customer.class);
    10         //limit  ?,?
    11         c.setFirstResult(0);
    12         c.setMaxResults(2);
    13         
    14         List<Customer> list =c.list();
    15         System.out.println(list);
    16         
    17         
    18         
    19         //--------------------------------------
    20         //提交事务
    21         tx.commit();
    22         //关闭session
    23         session.close();
    24     }
    View Code

            条件查询

            离线条件查询

     1 @Test
     2     //基本语法
     3     //注意此时生成ToString方法
     4     public void fun1() {
     5         //service/web层
     6         DetachedCriteria dc=DetachedCriteria.forClass(Customer.class);
     7         
     8         dc.add(Restrictions.idEq(61));//瓶装条件(全部与普通Criteria一致)
     9         //获取session
    10         Session session = HibernateUtils.openSession();
    11         //打开事务
    12         Transaction tx=session.beginTransaction();
    13         //--------------------------------------
    14         Criteria c=dc.getExecutableCriteria(session);
    15         List list=c.list();
    16         System.out.println(list);
    17         
    18         
    19         
    20         //--------------------------------------
    21         //提交事务
    22         tx.commit();
    23         //关闭session
    24         session.close();
    25 
    26         
    27     }
    View Code

         SQL检索

          用于接收sql进行查询。

          通过session.createSQLQuery(String sql);

    Hibernate的抓取策略(优化)

        延迟加载

          类级别             在<class>上配置lazy属性

          关联级别        在<set>、<many-to-one>上配置的lazy属性

        

        抓取策略

          Set上的fetch和lazy

            fetch   :     

              select

               join

              subselect

            lazy           :

              true

              false

              extra

          many-to-one上fetch和lazy

            fetch

            select

            join

           lazy

            proxy

            false

            no-proxy

      结论:为了提高效率.fetch的选择上应选择select. lazy的取值应选择 true. 全部使用默认值.

  • 相关阅读:
    BZOJ 5308 [ZJOI2018] Day2T2 胖 | 二分 ST表
    CodeForces 464E The Classic Problem | 呆克斯歘 主席树维护高精度
    BZOJ5298 [CQOI2018] 交错序列 | 矩阵乘法和一个trick
    # BZOJ5300 [CQOI2018]九连环 题解 | 高精度 FFT
    [BZOJ5248] 2018九省联考 D1T1 一双木棋 | 博弈论 状压DP
    【2018九省联考】后的瞎扯
    BZOJ 4671 异或图 | 线性基 容斥 DFS
    Luogu 4294 [WC2008]游览计划 | 斯坦纳树
    BZOJ 2434 阿狸的打字机 | AC自动机
    UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP
  • 原文地址:https://www.cnblogs.com/money131/p/10691708.html
Copyright © 2020-2023  润新知