zoukankan      html  css  js  c++  java
  • hibernate查询方式总结(四)之QBC,QBE查询

    QBC(Query By Criteria) 查询方式

    这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。使用QBC查询,一般需要以下三个步骤:

    1.使用Session实例 的createCriteria()方法创建Criteria对象
    2.使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组。
    3.使用Criteria对象的list()方法进行查询并返回结果

    Restrictions类的常用方法:

    方法名称 描述
    Restrictions.eq 等于
    Restrictions.allEq 使用Map,Key/Valu进行多个等于的比对
    Restrictions.gt 大于
    Restrictions.ge 大于等于
    Restrictions.lt 小于
    Restrictions.le 小于等于
    Restrictions.between 对应SQL的between
    Restrictions.like 对应SQL的like
    Restrictions.in 对应SQL的in
    Restrictions.and and关系
    Restrictions.or or关系
    Restrictions.sqlRestriction SQL限定查询

    Order类的常用方法:

    方法名称 描述
    Order.asc 升序
    Order.desc 降序

    Projections类的常用方法

    方法名称 描述
    Projections.avg 求平均值
    Projections.count 统计某属性的数量
    Projections.countDistinct 统计某属性不同值的数量
    Projections.max 求最大值
    Projections.min 求最小值
    Projections.projectionList 创建一个ProjectionList对象
    Projections.rowCount 查询结果集中的记录条数
    Projections.sum 求某属性的合计

    例1: 查询出所有的顾客信息

    Criteria criteria = session.createCriteria(Customer.class);
    List<Customer> customers = criteria.list();
    for(Customer cus : customers){
        System.out.println(cus);
    }
    

    例2: 查询符合条件的顾客的信息(年龄大于12)

    Criteria criteria = session.createCriteria(Customer.class);
        criteria.add(Restrictions.gt("age", 12));
        List<Customer> customers = criteria.list();
        for(Customer cus : customers){
            System.out.println(cus);
    }
    

    例3: 查询名字在"terry,larry,tom"之间的用户的信息

    Session session = HibernateSessionFactory.getSession();
    Transaction tran = session.beginTransaction();
    String[] names = {"terry","larry","tom"}; 
    Criteria criteria = session.createCriteria(Customer.class);
    criteria.add(Restrictions.in("name", names));
    List<Customer> customers = criteria.list();
    for(Customer cus : customers){
        System.out.println(cus);
    }
    

    Order 排序

    criteria.addOrder() 添加排序约束
     Order.desc("id") 按照id降序排列
     Order.asc("id")  按照id升序排列
    

    QBC 离线条件查询

    离线条件查询使用的是 DetachedCriteria 接口进行查询,离线条件查询对象在创建的时候不需要使用 Session 对象,在添加条件 时也不需要 Session 对象,只有在查询的时候使用 Session 对象即可,所以叫做离线条件查询。

    为什么要有离线条件查询?
    一般情况下,在业务层开启 Session 后,在持久层对数据进行操作,而在 web 层需要接收条件查询的若干条件,所以在 web 层就设置条件会很方便,又因为 Criteria 需要由 Session 创建,所以无法在 web 层设置条件,于是离线条件查询出现了。

    创建离线条件查询对象

     DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
    

    具体的代码如下,注意顺序,这样是可行的

     DetachedCriteria criteria = DetachedCriteria.forClass(Linkman.class);
     // 设置查询条件
     criteria.add(Restrictions.eq("lkm_gender", "男"));
     
     Session session = HibernateUtils.getCurrentSession();
     Transaction tr = session.beginTransaction();
    
     // 查询数据
     List<Linkman> list = criteria.getExecutableCriteria(session).list();
     for (Linkman linkman : list) {
         System.out.println(linkman);
     }
     tr.commit();
    

    QBE(Query By Example)查询方式

    将一个对象的非空属性作为查询条件进行查询。

    示例:

       1: Session session = SessionFactory.getCurrentSession();
       2: User user = new User();
       3: user.setName("ijse");
       4: Transaction ts = session.beginTransaction();
       5: try {
       6:     Criteria criteria = session.createCriteria(User.class);
       7:     criteria.add(Example.create(user));
       8:     user= (User) criteria.list().get(0);    
       9:     session.commit();
      10: } catch (HibernateException ex) {
      11:     ts.rollBack();
      12:     ex.printStackTrace();
      13: }
      14: System.out.println(user.getName());
    

    原文参考文章如下:
    https://blog.csdn.net/iijse/article/details/6161143
    https://www.jianshu.com/p/242a08e1d3e9
    https://www.jianshu.com/p/21bcb31ea80e
    https://blog.csdn.net/iijse/article/details/6161143

  • 相关阅读:
    第01组 团队Git现场编程实战
    第01组 团队项目-需求分析报告
    团队项目-选题报告
    第二次结对编程作业
    第1组 团队展示
    第一次结对编程作业
    第一次博客作业
    2019 SDN上机第1次作业
    第08组 团队项目-需求分析报告
    团队项目-选题报告
  • 原文地址:https://www.cnblogs.com/linmsen/p/11729600.html
Copyright © 2011-2022 走看看