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

HIVE hql 中的count 高级使用方法 count(*)和count(1):对表中行数进行统计计算,包含null值。 count(某字段):对表中该字段的行数进行统计,不包含null值。如果出现空字符串,同样会进行统计。 SELECT type , count(*) , count(DISTINCT u) , count(CASE WHEN plat=1 THEN u ELSE NULL END) , count(DISTINCT CASE WHEN plat=1 THEN u ELSE NULL END) , cou 阅读详情

一. 函数

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

hibernate子查询 立即下载

相关推荐

共享单车需求预测问题:建模篇

机器学习训练营——机器学习爱好者的自由交流空间(qq群号:696721295) 在上一篇里,我们使用可视化的方法分析了“共享单车”的数据集,理解了特征(变量)之间的关系。我们将在本篇建立几个模型预测单车的需求量,并比较它们的预测效果。 随机森林填充法 首先,导入必需的库、训练集和检验集。 import pylab import calendar import numpy as np impor...

wong2016的博客 1万+

hql如何使用count

//第一种方法:   String hql = "select count(*) from User as user";   Integer count = (Integer)getHibernateTemplate().find(hql).listIterator().next();   return count.intValue(); //第二种方法:  String hql =

hello 1万+

团结引擎+OpenHarmony 2实战篇:从零构建鸿蒙应用开发环境

本文详细介绍了如何从零开始构建鸿蒙应用开发环境,重点讲解了团结引擎与OpenHarmony 2的实战配置步骤。内容包括DevEco Studio安装、OpenHarmony SDK配置、团结引擎集成及项目创建等关键环节,帮助开发者快速搭建高效的开发环境,提升鸿蒙应用开发效率。

weixin_29294395的博客 265

HQL中的子查询

子查询:   子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持。如下面代码所示: List list=session.createQuery(“from Customer c where 1>(select count(o) from c.orders o)”).list();

谢彬の优快云专栏 2万+

告别迷茫!用ETAS RTA-OS配置你的第一个AUTOSAR OS任务(含VRTA虚拟ECU实战)

本文详细介绍了如何使用ETAS RTA-OS工具链在VRTA虚拟ECU上配置和运行第一个AUTOSAR OS任务。通过从XML配置到任务调度的全流程实战,帮助开发者快速掌握嵌入式操作系统开发的核心步骤,特别适合刚接触AUTOSAR的开发者快速上手。

weixin_42533622的博客 418

基于卷积神经网络的人脸表情识别(JAFFE篇)

1.win10/11操作系统2.python3.7以上3.tensorflow2.4以上版本(2.0其它版本需要微调)4.内存12G,显卡4G以上(没有独显倒是也能跑...)(这个可爱的妹子就是JAFFE数据集中的图片)

小林同学的计算机学习 5914

hql使用子查询

一 简介 可以在sql中,我们经常使用子查询处理复杂的查询要求,在hql中,我们一样可以使用子查询来完成复杂查询要求: 二 实例 package com.cakin.view; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate

实践求真知 4313

SAP 关于WPS上传文件提示“文档中不包含数据“ 和“程序正在运行中“处理办法

最近这一周经常有用户反馈,使用WPS上传文件系统报错,一直提示“程序正在运行中”,另外在导入数据的时候提示"文档中不包含数据",跟进运维过程中遇到的这两种情况,分享一下处理的办法,如果各位更好的办法也可以给我留言分享。

我小时候很黑的博客 2855

第八章 Hibernate数据操作技巧

第八章 Hibernate数据操作技巧8.1 分组统计数据 语法:[select]... from ...[where] [group by...[having...]] [order by...] 8.1.1 聚合函数 1、count():统计记录数 例:Long count=(Long) session.createQuery("select...

weixin_30776545的博客 124

PCL 均匀采样【2026最新版】

根据输入点云数据创建一个微小的三维立方体集合,然后计算每个三维立方体的重心;由于该重心点不一定是原始点云中的点,直接用该点来表示立方体内所有的点会丢失原始点云的细小特征;所以使用k最近邻搜索寻找距离重心点最近的原始点来代替重心点。

点云侠的博客 41万+

Yolo8行人车辆目标检测实战分享 完整项目代码可直接运行

Yolo8行人车辆目标检测实战分享 完整项目代码可直接运行

1294

Hibernate QL语句测试用例

package com.hibernate.model; import java.util.Date; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.M...

OVO_LQ_Start的博客 315

2025届程序技术类笔试题

希尔排序在直接插入排序的基础上进行了改进,它通过比较相距一定间隔的元素来进行,各轮比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一轮排序为止。某人逆着水流的方向向岸边划船,每次行进前进x米后需要休息一下,休息期间船会自行倒退y米,每次休息后再次行进,前进距离缩短1/5,若起始距离岸边为m米,问:能否到达岸上,需要行进多少次才能上岸。直接插入排序的原理是将第i个元素插入前面i-1个已排好序的记录中,将比第i个元素大的记录依次向后移动一个位置,将第i个元素插入空位。第二轮相邻比较,后移2次。

博客 595

HQL和SQL的区别

hql是面向对象查询,格式:from + 类名 + 类对象 + where + 对象的属性 sql是面向数据库表查询,格式:from + 表名 + where + 表中字段 1、查询 一般在Hibernate中使用查询时,推荐使用hql(Hibernate Query Language)查询语句。 使用hql的时候需要注意: A、大小写敏感 因为hql是面向对象的,而对象类的名称和属性

303

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Hibernate查询——HQL,包括分页查询

hibernate查询 概述:数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。 HQL ——(Hibernate Query Language):Hibernate语言查询它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性 。Hibernate官方推荐使用HQL进行查询。 QBC——(Query By Criteria):标准化对象查询,以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java 程序

weixin_44677005的博客 2583

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

hibernate 三种查询方式

(一)HQL HQL:Hibernate Qusery Language,如果你已经熟悉它,就会发现它跟SQL非常相像。不过 你不要被表面的假象迷惑,HQL是面向对象的(OO,用生命的眼光看待每一个对象,他们是如此 鲜活)。如果你对JAVA和SQL语句有一定了解的话,那么HQL对你简直易如反掌,你完全可以利用在公车上的时间掌握它。 以下从几个方面进行慢慢深入: 1。大小些敏感 大家

asd2568494的专栏 375

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MySql如何对聚合函数count()查询的结果再次利用count()统计

hibernate中利用原生SQL语言查询MySql数据库时,如何利用count()先进行一次统计,在进行一次count()统计

靠谱的后现代 1万+

hibernate的HQL查询语句

1、标准查询Criteria (主要应用与简单的查询) Session session=HibernateSessionFactory.getSession(); Query query=null; Criteria criteria=session.createCriteria(Orders.class); criteria.addOrder(Order.desc("order...

weixin_42226094的博客 420

hibernate内部测试题总结

在Hibernate中,关于脏检查和刷新缓存说法正确的是(ab)。 A.当事务提交时,会发生脏检查 B.Session的flush( )方法是刷新缓存的方法 C.在执行Session的commit( )方法之前不会调用Session的flush( )方法 D.编写代码时,调用commit( )方法之前要调用flush( )方法 解析:在执行Session的commit()方法...

141

hibernate之HQL

1.HQL简介 HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似,在 Hibernate 提供的各种检索方式中,HQL 是使用最广的一种检索方式。 在查询语句中设定各种查询条件; 支持投影查询, 即仅检索出对象的部分属性; 支持分页查询; 支持连接查询; 支持分组查询, 允许使用 HAVING 和 GROUP BY 关键字; 提供内置聚集函数, 如 sum(), min() 和 max(); 支持子查询; 支持动态绑定参数.

weixin_58670730的博客 379

hibernate三种查询方式

(一)HQLHQL:Hibernate Qusery Language,如果你已经熟悉它,就会发现它跟SQL非常相像。不过你不要被表面的假象迷惑,HQL是面向对象的(OO,用生命的眼光看待每一个对象,他们是如此鲜活)。如果你对JAVA和SQL语句有一定了解的话,那么HQL对你简直易如反掌,你完全可以利用在公车上的时间掌握它。以下从几个方面进行慢慢深入:1。大小些敏感

wwxtu24的专栏 727

Hibernate 分组查询 子查询 原生SQL

分组查询: 使用group by关键字对数据分组,使用having关键字对分组数据设定约束条件,从而完成对数据分组和统计 1.1 聚合函数:常被用来实现数据统计功能 ① count() 统计记录条数 ② sum() 求和 ③ min() 求最小值 ④ max() 求最大值 ⑤ avg() 求平均值 使用分组查询 查询员工编号的平均值 Session session; ...

weixin_30819085的博客 111

EJB3.0笔记-实体查询与EJB QL

在java persistence中,可以同时使用EJB QL查询语言和原生的SQL来完成查询操作。由于EJB QL是一种描述Java对象的查询语言,而entity manager会为你处理由EJB QL向原生SQL转换的工作,因此它具有跨数据库厂商实现的移植能力。EJB QL比SQL更加紧凑和更容易阅读,但是EJB QL不可能都支持数据库所有私有特性,所以功能上没有厂商原生SQL那么功能全面。

林踪翼影的专栏 4047

Hibernate的三种查询方式

Hibernate提供了三种查询方式: 1. Criteria查新方式(QBC); Criteria 查询采用**面向对象**方式封装查询条件,又称为对象查询;就是对SQL 语句进行封装,**采用对象的方式来组合各种查询条件**,由Hibernate自动产生SQL 查询语句。**Criteria查询只能进行一些比较简单的查询**; Session session ...

空调不够冷 607
上一篇: MyBatis 事务源码分析
下一篇: ORA-02291: 违反完整约束条件 (*) - 未找到父项关键字
ohmygodvv
博客等级 码龄4年 521粉丝 140原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ohmygodvv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值