zoukankan      html  css  js  c++  java
  • Hibernate 的多种查询方式 —— HQL 与 QBC

    OID 查询

    OID 查询是指根据对象 OID 主键进行检索

    OID 查询方式:

    • get(): 立即发出 SQL 语句,返回实际对象,查询不到时返回 null
    • load(): 返回一个目标对象的代理对象,只存储了目标对象的 ID 值,当调用其他属性时才发出 SQL 语句,查询不到报错

    对象导航检索

    对象导航检索是指根据一个已查询到的对象,获得其关联对象

    HQL(Hibernate Query Language)

    hibernate 的查询语言,类似于 SQL, 但面向对象。采用 session.creatQuery(),注意不支持 * 的写法

    简单查询

    ```
    Query query = session.createQuery("from User");
    List<User> list = query.list();
    ```
    

    别名查询

    ```
    Query query = session.createQuery("select c from User c");
    List<User> list = query.list();
    ```
    

    排序查询

    ```
    Query query = session.createQuery("select c from User c order by user_id desc");
    List<User> list = query.list();
    ```
    

    条件查询

    • 位置绑定,类似于 JDBC 现在不用了
    • 名称绑定
      Query query = session.createQuery("from User where user_code=:aaa and user_name=:bbb");
      query.setParameter("aaa","11");
      query.setParameter("bbb","user1");
      List<User> list = query.list();
      

    投影查询

    • 单个属性
      List<Object> list = session.createQuery("select c.user_name from User c").list();
      System.out.println(list);
      
    • 多个属性
      List<Object[]> list = session.createQuery("select c.user_name,c.user_code from User c").list();
      for (Object[] objects : list) {
          System.out.println(Arrays.toString(objects));
      }
      
    • 多个属性,封装到对象,需要提供构造器
      List list = session.createQuery("select new User(user_code,user_name) from User").list();
      System.out.println(list);
      

    分页查询

    ```
    Query query = session.createQuery("from User");
    // 位置从 0 开始数,包含 0
    query.setFirstResult(0);
    query.setMaxResults(2);
    List list = query.list();
    System.out.println(list);
    ```
    

    统计查询

    • 统计
      Object o = session.createQuery("select count(*) from User").uniqueResult();
      System.out.println(o);
      
    • 分组
      List<Object[]> list = session.createQuery("select user_code,count(*) from User group by user_code").list();
      for (Object[] objects : list) {
          System.out.println(Arrays.toString(objects));
      }
      

    多表查询

    • 内连接:外键相等的部分取出来
    • 左连接:左边表全部,右边只查外键相等部分
    • 右连接:右边表全部,左边表只查外键相等部分
    • 普通内连接
      List<Object[]> list = session.createQuery("from User c inner join c.roles").list();
      for (Object[] objects : list) {
          System.out.println(Arrays.toString(objects));
      }
      
    • 迫切内连接
      List<User> list = session.createQuery("from User c inner join fetch c.roles").list();
      for (User user : list) {
          System.out.println(user);
      }
      

    QBC(Query By Criteria)

    QBC 主要用于条件查询,更加面向对象

    简单查询

    ```
    List<User> list = session.createCriteria(User.class).list();
    for (User user : list) {
        System.out.println(user);
    }
    ```
    

    排序查询

    ```
    // 添加排序
    criteria.addOrder(Order.asc("user_id"));
    ```
    

    分页查询

    ```
    // 添加分页
    criteria.setFirstResult(0);
    criteria.setMaxResults(2);
    ```
    

    条件查询

    • 条件

      = eq
      > gt
      >= ge
      < lt
      <= le
      <> ne
      like
      in
      and
      or

    • 单个条件
      criteria.add(Restrictions.eq("user_name","user1"));
      
    • 多个条件
      criteria.add(Restrictions.eq("user_name","user1"));
      criteria.like(Restrictions.eq("user_code","1%"));
      
    • 统计查询
      Criteria criteria = session.createCriteria(User.class);
      // setProjection 设置一些聚合函数
      Object o = criteria.setProjection(Projections.rowCount()).uniqueResult();
      System.out.println(o);
      
    • 离线条件查询,脱离Session,添加条件,可以在外部提前使用 DetachedCriteria 对象提交设置好条件,最后再绑定到 session 当中
      DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
      // 设置条件
      detachedCriteria.add(Restrictions.eq("user_name","user1"));
      // 打开 session
      Session session = HibernateUtil.openSession();
      Criteria executableCriteria = detachedCriteria.getExecutableCriteria(session);
      List list = executableCriteria.list();
      System.out.println(list);
      



  • 相关阅读:
    洛谷 P2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat…(树规)
    STREAMING #5 题解 3.高位网络
    冲刺NOIP2015提高组复赛模拟试题(五) 3.破坏基地
    冲刺NOIP2015提高组复赛模拟试题(五)2.道路修建
    冲刺NOIP2015提高组复赛模拟试题(五)1.数学作业
    洛谷P1186 玛丽卡 spfa+删边
    清北学堂 day6 花
    清北学堂 day6 兔子
    C++ STL 全排列函数
    flash分区的意义
  • 原文地址:https://www.cnblogs.com/mdz3201/p/HQL_QBC.html
Copyright © 2011-2022 走看看