Hibernate 函数 ,子查询 和原生SQL查询

news/2024/11/23 9:11:31/

一. 函数

    聚合函数: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


http://www.ppmy.cn/news/1229975.html

相关文章

IObit Unlocker丨解除占用程序软件

更多内容请收藏&#xff1a;https://rwx.tza-3.xyz 官网&#xff1a;IObit Unlocker “永远不用担心电脑上无法删除的文件。” 界面简单&#xff0c;支持简体中文&#xff0c;一看就会&#xff0c;只需要把无法删除/移动的文件或整个U盘拖到框里就行。 解锁率很高&#xff0c;…

PC3329L DC-DC降压 10V-100V输入3A大流输出带EN功能实现零功耗只需极少元器件

1. PC3392L特性  通过使能脚关断实现零功耗  宽电压输入范围 10V 至 100V  最大输出电流 3A  集成功率 MOS 管  外围器件少  输出短路保护  温度保护  逐周期限流  输出电压灵活可靠  ESOP8 2. 描述 PC3392L 一款宽电压范围降压型 DC-DC 电源管…

HTTP四种请求方式,状态码,请求和响应报文

1.get请求 一般用于获取数据请求参数在URL后面请求参数的大小有限制 2.post请求 一般用于修改数据提交的数据在请求体中提交数据的大小没有限制 3.put请求 一般用于添加数据 4.delete请求 一般用于删除数据 5.一次完整的http请求过程 域名解析&#xff1a;使用DNS协议…

mysql 集群恢复

准备使用集群的时候发现集群起不来&#xff0c; 发现抱错集群各个节点都是readonly 状态&#xff0c;找了很多资料&#xff0c;由于集群处于不一致的情况需要防止不同的节点数据写入脏数据 取消节点readonly 方法如下&#xff1a; MySQL 取消 super read only 直接关闭read…

Python如何实现原型设计模式?什么是原型设计模式?Python 原型设计模式示例代码

什么是原型&#xff08;ProtoType&#xff09;设计模式&#xff1f; 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在通过复制现有对象来创建新对象&#xff0c;而无需通过标准的构造方式。它允许我们基于现有对象创建新对象&#xf…

Django DRF权限组件

在Django的drf框架内的权限组件&#xff0c;如果遇到多个权限认证类&#xff0c;是需要所有的权限类都要通过验证&#xff0c;才能访问视图。 一、简单示例 1、per.py 自定义权限类 from rest_framework.permissions import BasePermission import randomclass MyPerssion(B…

Vue3--Vue Router详解--学习笔记

1. 认识vue-router Angular的ngRouter React的ReactRouter Vue的vue-router Vue Router 是Vue.js的官方路由&#xff1a; 它与Vue.js核心深度集成&#xff0c;让Vue.js构建单页应用&#xff08;SPA&#xff09;变得非常容易&#xff1b;目前Vue路由最新的版本是4.x版本。 v…

【VRTK】【VR开发】【Unity】7-配置交互能力和向量追踪

【前情提要】 目前为止,我们虽然设定了手模型和动画,还能够正确根据输入触发动作,不过还未能与任何物体互动。要互动,需要给手部设定相应的Interactor能力。 【配置Interactor的抓取功能】 在Hierarchy中选中[VRTK_CAMERA_RIGS_SETUP] ➤ Camera Rigs, Tracked Alias ➤ …