zoukankan      html  css  js  c++  java
  • [原创]java WEB学习笔记92:Hibernate学习之路-- -QBC 检索和本地 SQL 检索:基本的QBC 查询,带 AND 和 OR 的QBC,统计查询,排序,分页

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

    内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

    本人互联网技术爱好者,互联网技术发烧友

    微博:伊直都在0221

    QQ:951226918

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1.QBC 检索和本地 SQL 检索

      1)QBC 查询就是通过使用 Hibernate 提供的 Query By Criteria API 来查询对象,这种 API 封装了 SQL 语句的动态拼装,对查询提供了更加面向对象的功能接口

      2)本地SQL查询来完善HQL不能涵盖所有的查询特性:添加操作

    2.QBC 的具体实践和相关API

      1)基本的QBC 查询

     1 @Test
     2     public void testQBC(){
     3         //1.创建一个Criteria 对象
     4         Criteria criteria = session.createCriteria(Employee.class);
     5         
     6         //2.添加查询条件: 在QBC 中查询条件使用 Criteria 表示
     7         //Criteria 可以通过 Restrictions 的静态方法得到
     8         criteria.add(Restrictions.eq("email", "SKUMAR"));
     9         criteria.add(Restrictions.gt("salary", 5000F));
    10         
    11         //3.执行查询
    12         Employee employee = (Employee) criteria.uniqueResult();
    13         System.out.println(employee);
    14     }
    15     

      2)带 AND 和 OR 的QBC: Restrictions 封装了一个常用的逻辑运算,算术等

      

     1 @Test
     2     public void testQBC2(){
     3         Criteria criteria = session.createCriteria(Employee.class);
     4         
     5         //1.AND :使用Conjunction 表示
     6         //conjuntion 本身就是一个criteria 对象,且其中还可以添加Criteria 对象
     7         Conjunction conjunction = Restrictions.conjunction();
     8         conjunction.add(Restrictions.like("name", "a",MatchMode.ANYWHERE));
     9         Department dept = new Department();
    10         dept.setId(80);
    11         conjunction.add(Restrictions.eq("dept", dept));
    12         System.out.println(conjunction); //(name like %a% and dept=Department [id=80])
    13         
    14         //2.OR
    15         Disjunction disjunction = Restrictions.disjunction();
    16         disjunction.add(Restrictions.ge("salary", 6000F));
    17         disjunction.add(Restrictions.isNotNull("email") );
    18         
    19         System.out.println(disjunction);//(salary>=6000.0 or email is not null)
    20         
    21         //添加至 criteria
    22         criteria.add(disjunction);
    23         criteria.add(conjunction);
    24         
    25         //执行
    26         criteria.list();
    27         
    28     }
     1 Hibernate: 
     2     select
     3         this_.ID as ID1_1_1_,
     4         this_.NAME as NAME2_1_1_,
     5         this_.SALARY as SALARY3_1_1_,
     6         this_.EMAIL as EMAIL4_1_1_,
     7         this_.DEPT_ID as DEPT_ID5_1_1_,
     8         department2_.ID as ID1_0_0_,
     9         department2_.NAME as NAME2_0_0_ 
    10     from
    11         GG_EMPLOYEE this_ 
    12     left outer join
    13         GG_DEPARTMENT department2_ 
    14             on this_.DEPT_ID=department2_.ID 
    15     where
    16         (
    17             this_.SALARY>=? 
    18             or this_.EMAIL is not null
    19         ) 
    20         and (
    21             this_.NAME like ? 
    22             and this_.DEPT_ID=?
    23         )

      3)统计查询:Projections 封装了一些 sql的聚合函数

    
    

      

    1 @Test
    2     public void testQBC3(){
    3         Criteria criteria = session.createCriteria(Employee.class);
    4         
    5         //统计查询:使用Projection 来表示 可以由Projections 静态方法得到
    6         criteria.setProjection(Projections.max("salary"));
    7         System.out.println(criteria.uniqueResult());
    8         
    9     }
    1 Hibernate: 
    2     select
    3         max(this_.SALARY) as y0_ 
    4     from
    5         GG_EMPLOYEE this_
    6 24000.0

      4)排序,分页

     1     @Test
     2     public void testQBC4(){
     3         Criteria criteria = session.createCriteria(Employee.class);
     4         //1.添加排序
     5         criteria.addOrder(Order.asc("salary"));
     6         criteria.addOrder(Order.desc("email"));
     7         
     8         //2.添翻页方法
     9         int pageSize = 5;
    10         int pageNo = 3;
    11         criteria.setFirstResult((pageNo -1 ) * pageSize)
    12                 .setMaxResults(pageSize)
    13                 .list();
    14 
    15         
    16     }
    17     
     1 Hibernate: 
     2     select
     3         * 
     4     from
     5         ( select
     6             row_.*,
     7             rownum rownum_ 
     8         from
     9             ( select
    10                 this_.ID as ID1_1_1_,
    11                 this_.NAME as NAME2_1_1_,
    12                 this_.SALARY as SALARY3_1_1_,
    13                 this_.EMAIL as EMAIL4_1_1_,
    14                 this_.DEPT_ID as DEPT_ID5_1_1_,
    15                 department2_.ID as ID1_0_0_,
    16                 department2_.NAME as NAME2_0_0_ 
    17             from
    18                 GG_EMPLOYEE this_ 
    19             left outer join
    20                 GG_DEPARTMENT department2_ 
    21                     on this_.DEPT_ID=department2_.ID 
    22             order by
    23                 this_.SALARY asc,
    24                 this_.EMAIL desc ) row_ 
    25         where
    26             rownum <= ?
    27         ) 
    28     where
    29         rownum_ > ?

    3.由于QBC 不支持插入操作,所以hibernate 支持使用原生的 sql 进行更新操作

     1 @Test
     2     public void testNaviteSQL(){
     3         String sql = "INSERT INTO gg_department VALUES(?,?)";
     4         Query query = session.createSQLQuery(sql);
     5         
     6         query.setInteger(0, 300)
     7             .setString(1, "JASON")
     8             .executeUpdate();
     9         
    10     }
    1 Hibernate: 
    2     INSERT 
    3     INTO
    4         gg_department
    5         
    6     VALUES
    7         (?,?)

     4.QBC 支持删除操作

    1 @Test
    2     public void testUpdate(){
    3         String hql = "DELETE FROM Department d WHERE d.id = :id";
    4         session.createQuery(hql).setInteger("id", 280).executeUpdate();
    5     }
    1 Hibernate: 
    2     delete 
    3     from
    4         GG_DEPARTMENT 
    5     where
    6         ID=?
  • 相关阅读:
    Effective Java(二)—— 循环与 StringBuilder
    Java 错误:找不到或无法加载主类(源文件中含有包名 package)
    古代文学经典、现代文学经典
    逻辑一致、交叉验证
    框架设计的一些思考
    Ping
    Hypver-V中的快照
    事件日志订阅-基于 源已启动
    组策略--下发计划任务到计算机
    组策略--下发文件到计算机
  • 原文地址:https://www.cnblogs.com/jasonHome/p/5936427.html
Copyright © 2011-2022 走看看