Hibernate 函數 ,子查詢 和原生SQL查詢


一. 函數

    聚合函數:count(),avg(),sum(),min(),max()

例:(1)查詢Dept表中的所有的記錄條數。

     String hql=" select count(*) from Dept ";

     Long count=(Long)session.createQuery(hql).uniqueResult();

當不確定返回的是什么類型的時候可以根據:變量名.getClass()方法得到類型

例如:count.getClass()  返回的是:java.lang.Long

     (2)查詢所有員工的工資總和。

     String hql="select sum(salary) from Emp";

     Double salary=(Double)session.createQuery(hql).uniqueResult();

     (3)查詢員工最低的工資。

     String hql="select min(salary) from Emp";

     Double salarymin=(Double)session.createQuery(hql).uniqueResult();

     (4)查詢員工最高的工資

      String hql="select max(salary) from Emp";

      Double salarymax=(Double)session.createQuery(hql).uniqueResult();

     (5)查詢員工的平均工資

      String hql="select avg(salary) from Emp";

      Double salaryavg=(Double)session.createQuery(hql).uniqueResult();

     (6)查詢員工最低工資,最高工資和平均工資

      String hql="select min(salary),max(salary),avg(salary) from Emp";

      Object[] obj=(Object[])session.createQuery(hql).uniqueResult();

      System.out.println(obj[0]+"\t"+obj[1]+"\t"+obj[2]);

二.分組查詢

    (1)按職位統計員工個數

     String hql="select  job,count(e)  from  Emp e group by job";

     List(Object[]) list=session.createQuery(hql).list();

     for(Object[] obj:list){

         System.out.println(obj[0]+"\t"+obj[1]);

      }

     Query的list()方法返回的集合包含2個Object[]對象數組類型的元素,每個對象數組對應查詢結果中的一條記錄,數組的第一個元素是

     job職位名稱,第二個元素是count(e)員工個數。

    查詢結果:

    ENGINEER   9

    SALES   12

    (2)查詢各個部門的平均工資。

     String hql="select e.dept.deptName,avg(e.salary) from Emp e group by e.dept.deptName";

     Iterator<Object[]> list=session.createQuery(hql).list().iterator();

     while(list.hasNext()){

        Object[] obj=list.next();

        System.out.println(obj[0]+"\t"+obj[1]);

     }

     Query的list()方法返回的集合中包含3個Object[]對象數組類型的元素,每個對象數組對應查詢結果中的一條記錄,數組中的第一個元

     素是e.dept.deptName部門名稱,第二個元素是avg(e.salary)員工平均工資 

     查詢結果:

     研發部   3250.0

     市場部   5000.0

     財務部   3000.0

    (3)查詢各個職位的最低工資和最高工資

     String hql="select job,min(e.salary),max(e.salary) from Emp e group by job";

     Iterator<Object[]> list=session.createQuery(hql).list().iterator();

      while(list.hasNext()){

      Object[] obj=list.next();

      System.out.println(obj[0]+"\t"+obj[1]+"\t"+obj[2]);

      }

      查詢結果:

      ENGINEER   4900.0  5100.0

      SALES    2900.0   3100.0

      Query的list()方法返回的集合包含2個Object[]對象數組類型的元素,每個對象數組對應查詢結果中的一條記錄,數組的第一個元素是

      job職位名稱,第二個元素是min(e.salary)員工最低工資,第三個元素是max(e.salary)員工最高工資。

    (4)查詢各個部門平均工資高於4000元的部門名稱,輸出部門名稱和部門平均工資

   String hql="select e.dept.deptName,avg(e.salary) from Emp e group by e.dept.deptName having avg(e.salary)>4000";

    List<Object[]> list=session.createQuery(hql).list();

     for(Object[] obj:list){

         System.out.println(obj[0]+"\t"+obj[1]);

     }

     查詢結果:

     市場部   4987.5

 三.子查詢(any():返回任意一條記錄    all():返回的所有記錄   some:和“any”意思相同  in:與“=any”意思相同  

      exists:至少返回一條記錄)

    (1)查詢所有員工工資小於5000的部門

     String hql="from Dept d where 5000>all(select e.salary from d.emps e)";

     List<Dept> list=session.createQuery(hql).list();

     for(Dept dept:list){

        System.out.println(dept.getDeptName());

     }

     在這里不明白用什么類型的來接收,就用上面提到的方法:變量名.getClass()方法得到

     根據部門表查詢出工資低於5000的部門,根據導航屬性可以得到員工的集合,在單獨比較工資,即可得到數據。

     最不好理解的地方就是where條件后面的語句,只要仔細分析就可以明白。

     查詢結果:

     財務部

     (2)查詢至少有一位員工的工資低於5000的部門

      String hql="from Dept d where 5000>any(select e.salary from d.emps e)";

      List<Dept> list=session.createQuery(hql).list();

      for(Dept dept:list){

            System.out.println(dept.getDeptName());

      }

      得到結果:

      研發部

      財務部

      市場部

      (3)查詢有員工工資正好是5000元的部門

       String hql="from Dept d where 5000=any(select e.salary from d.emps e)";

       List<Dept> list=session.createQuery(hql).list();

       for(Dept dept:list){

            System.out.println(dept.getDeptName());

        }

       其中hql語句也可以這樣寫:

       String hql="from Dept d where 5000=some(select e.salary from d.emps e)";

       或者:

       String hql="from Dept d where 5000  in  (select e.salary from d.emps e)";

       得到結果:

       市場部

      (4)查詢至少有一位員工的部門     

        String hql="from Dept d where  exists  (from d.emps e)";

       List<Dept> list=session.createQuery(hql).list();

       for(Dept dept:list){

            System.out.println(dept.getDeptName());

        }

        查詢結果:

        市場部

        研發部

        財務部

四.操作集合的函數和屬性

    { 

       size()和size:獲取集合中元素的數目

       minElement()和minElement:對於包含基本類型元素的集合,獲得集合中取值最小的元素

       minIndex()和minIndex:對於建立了索引的集合,獲得最小的索引

       maxIndex()和maxIndex:對於建立了索引的集合,獲得最大的索引

       maxElement和maxElement:對於包含基本類型元素的集合,獲得集合中取值最大的元素

       elements():獲取集合中的所有元素

     }

     (1)查詢指定員工所在的部門

      Emp emp=new Emp();

      emp.setEmpNo(1);

      String hql="from Dept d where ? in elements(d.emps)";

      List<Dept> list=session.createQuery(hql).setParameter(0,emp).list();

      for(Dept dept:list){

           System.out.println(dept.getDeptName());

      }

      查詢結果:

      市場部

     (2)查詢員工個數大於5的部門

      String hql="from Dept d where d.emps.size>5";

      List<Dept> list=session.createQuery(hql).list();

      for(Dept dept:list){

          System.out.println(dept.getDeptName());

      }

      查詢結果:

       研發部

       市場部

五.原生SQL查詢和命名查詢

    原生SQL查詢:

    (1)查詢員工姓名中帶有e的,並且職位為ENGINEER的員工

      String sql="select * from  EMP where ENAME like :ename and JOB:job";

      List<Object[]> list=session.createSQLQuery(sql).setString("ename","%e%").setString("job","ENGINEER").list();

      for(Object[] obj:list){

           System.out.println(obj[0]+"\t"+obj[1]);

       }

     查詢結果:

     0   emp0

     1   emp1

     2   emp2

     原生SQL查詢和HQL查詢都使用了Query接口,對於原生SQL 查詢方式,使用Session的createSQLQuery()方法來創建SQLQuery對

     象,createSQLQuery()方法的參數是本地底層數據庫的SQL語句,Hibernate支持SQL語句使用命名參數和占位符“?”,SQLQuery

     接口繼承了Query接口。

     SQLQuery接口的list()方法返回的List集合中存放的是關系數據,這些數據分別裝載在3個Object[]對象數組中,每個數組對應查詢結

     果中的一行,行中的每一列都是Object類型。其中SQLQuery接口提供了addEntity()方法把查詢結果集中的關系數據映射為對象。

   (2)使用addEntity()方法把關系數據映射為對象

     String sql="select * from EMP where ENAME LIKE :ename and JOB:job";

     List<Emp>  list=session.createSQLQuery(sql).addEntity(Emp.class).setString("ename","%e%")

      .setString("job","ENGINEER").list(); 

       for(Emp emp:list){

              System.out.println(emp.getEmpName()); 

      }

      查詢結果:

      0   emp0

      1   emp1 

      2   emp2

    (3)查詢指定職位的員工,並輸出員工姓名和部門名稱

      String sql="select {e.*},{d.*} from EMP e join DEPT d on d.DEPTNO=e.DEPTNO where e.JOB=:job";

      List<Object[]> list=session.createSQLQuery(sql).addEntity("e",Emp.class).addJoin("d","e.dept")

       .setString("job","ENGINEER").list();

       for(Object[] obj:list){

           System.out.println(obj[0].getClass()+"\t"+obj[1].getClass());

       }

      使用SQLQuery接口的addJoin()方法,建立了Emp對象和Dept對象之間的關聯,list()方法放回的List集合中存放的是Object[]

      數組對象,數組的第一個元素是Emp對象,第二個元素是Dept對象。

六.命名查詢

     Hibernate支持在映射文件中定義字符串形式的查詢語句,這樣的查詢語句稱為命名查詢語句。

     命名查詢語句可以是原生SQL語句查詢,也可以是HQL語句查詢

    (1)查詢指定職位的員工

       Emp.hbm.xml配置一個和<class>元素並列的<Query>元素

        <query name="findEmp">

              from Emp e where e.job:job

        </query>

        List<Emp> list=session.getNamedQuery("findEmp").setString("job","ENGINEER").list();

        for(Emp emp:list){

               System.out.println(emp.getEmpName());

         }

        查詢結果:

         emp0

         emp1

         emp2   

        (2)原生SQL查詢語句的命名查詢

            Emp.hbm.xml 

          <sql-query name="findEmp">

                <return alias="e" class="Emp">

                select {e.*} from EMP e where e.job=:job

          </sql-query>

          List<Emp> list=session.getNamedQuery("findEmp").setString("job","ENGINEER").list();

          for(Emp emp:list){

               System.out.println(emp.getEmpName());

           }

          查詢結果:

          emp0

          emp1

          emp2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM