Hibernate之HQL總結

框架下載地址
百度雲盤

Hibernate簡介

Hibernate是一個開放源代碼的對象關係映射框架(ORM),它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關係,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。Hibernate架構包括許多對象持久對象,會話工廠,事務工廠,連接工廠,會話,事務等

這裏寫圖片描述
更多信息

HQL語言

HQL(Hibernate Query Language)是完全面向對象的查詢語言。它提供了更加面向對象的封裝,因此它支持繼承、多態等特徵。
HQL基本語法如下:
注意這裏查詢的都是JAVA類對象
select "對象.屬性名"
from "對象名"
where "條件"
group by "對象.屬性名" having "分組條件"
order by "對象.屬性名"
  1. 實體對象查詢

    • 查詢所有信息

      Employee是一個實體類
      select * from Employee 
      等價於
      from Employee
    • 查詢指定列名(投影查詢)

      注意:Employee對象必須要有構造方法public Employee(String empname, String job)
      select new Employee (empname,job) from Employee

  2. 條件查詢

    • 簡單條件查詢

      from Employee emp where emp.sex="男"
    • 分頁查詢
      Employee ee = new Employee();
          // ee.setEmpname("楊%");
           ee.setSalary(6000.0);
          // ee.setJob("神鵰大俠");
      
          Session session = HibernateSessionFactory.getSession();
      
          StringBuffer buffer = new StringBuffer("from Employee where 1=1");
          //拼接HQL
          if (ee.getEmpname() != null && ee.getEmpname().length() > 0) {
              buffer.append(" and empname like :empname");
          }
      
          if (ee.getSalary() != null && ee.getSalary() > 0) {
              buffer.append(" and salary> :salary");
          }
      
          if (ee.getJob() != null && ee.getJob().length() > 0) {
              buffer.append(" and job= :job");
          }
          Query query=session.createQuery(buffer.toString());
          query.setProperties(ee);
          //設置分頁
          query.setFirstResult(0);
          query.setMaxResults(5);
          List<Emp> list=query.list();
          for (Emp e : list) {
              System.out.println(e.getEmpid() + "," + e.getEmpname() + ","
                      + e.getGender() + "," + e.getJob() + "," + e.getSalary());
          }
          HibernateSessionFactory.closeSession();
  3. 參數綁定機制

    • 佔位符 替代具體參數

      Session session=HibernateSessionFactory.getSession();
      String hql="from Emp where empname like ? and salary>? and job=?";
      
      Query query=session.createQuery(hql);
      //按順序賦值
      query.setString(0, "楊過");
      query.setDouble(1, 5000);
      query.setString(2, "神鵰大俠");
      List<Emp> list=query.list();
      //處理集合,關閉session
      HibernateSessionFactory.closeSession();
    • 引用佔位符 :param 替代具體參數

      ...
      Session session=HibernateSessionFactory.getSession();       
      String hql="from Emp where empname like :empname and salary>:salary and job=:job";
      Query query=session.createQuery(hql);
      //按名稱賦值
      query.setString("empname", "楊過");
      query.setDouble("salary", 5000);
      query.setString("job", "神鵰大俠");
      //不知道參數類型的情況下
      query.setParameter("sex","男");
      List<Emp> list=query.list();
      //處理集合,關閉session
      HibernateSessionFactory.closeSession();
    • 對象查詢

      ...
      Session session=HibernateSessionFactory.getSession();       
      String hql="from Emp where empname like :empname and salary>:salary and job=:job";
      Query query=session.createQuery(hql);
      Emp ee=new Emp();
      ee.setEmpname("楊%");
      ee.setSalary(5000.0);
      ee.setJob("神鵰大俠");
      //這裏是將信息存入了emp對象
      //將emp對象放入作爲查詢參數
      //這裏也支持Map格式的對象
      query.setProperties(ee);
      List<Emp> list=query.list();
      //處理集合,關閉session
      HibernateSessionFactory.closeSession();
  4. 排序查詢
    在SQL中通過order by 子句和 ascdesc 實現排序操作。HQL也提供了這樣的功能,用法和SQL類似,只是操作的不再是數據表的列名,而是實體對象的屬性。

    //按員工年齡降序排序,多個條件用逗號**,** 分隔
    from Employee emp order by emp.age desc,emp.sex asc
  5. 聚合函數
    HQL同樣也支持聚合函數,如 sum、avg、count、max、min 等。

    例1:查詢員工的平均年齡
        select avg(emp.age) from Employee emp
    例2:統計員工個數(統計任意列都可以)
        select count(emp.age) from Employee emp
    
  6. 子查詢
    HQL中子查詢必須被圓括號()包起來

     查詢年齡大於平均年齡的員工
    from Employee emp where emp.age>(select avg(age) from Employee)
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章