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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/151741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL InnoDB 引擎底层解析(一)

6. InnoDB 引擎底层解析 MySQL 对于我们来说还是一个黑盒&#xff0c;我们只负责使用客户端发送请求并等待服务器返回结果&#xff0c;表中的数据到底存到了哪里&#xff1f;以什么格式存放的&#xff1f;MySQL 是以什么方式来访问的这些数据&#xff1f;这些问题我们统统不知…

AnyTXT Searcher:本地文件内容搜索神器如何搭建与远程访问

文章目录 前言1. AnyTXT Searcher1.1 下载安装AnyTXT Searcher 2. 下载安装注册cpolar3. AnyTXT Searcher设置和操作3.1 AnyTXT结合cpolar—公网访问搜索神器3.2 公网访问测试 4. 固定连接公网地址 前言 你是否遇到过这种情况&#xff0c;异地办公或者不在公司&#xff0c;想找…

iOS_折叠展开 FoldTextView

1. 显示效果 Test1&#xff1a;直接使用&#xff1a; Test2&#xff1a;在 cell 里使用&#xff1a; 2. 使用 2.1 直接使用 // 1.1 init view private lazy var mooFoldTextView: MOOFoldTextView {let view MOOFoldTextView(frame: .zero)view.backgroundColor .cyanvie…

线上发生锁表怎么办 show processlist命令详解

大厂面试题&#xff1a;千万级别mysql表锁表了怎么办&#xff0c;如何处理 - 知乎 (zhihu.com) 记一次mysql执行DDL导致锁表_ddl 为啥会锁表-CSDN博客 mysql: show processlist 详解 - 知乎 (zhihu.com)

Redis字典实现

前言 字典又称符号表&#xff0c;关联数组或者映射(map)。是一种保存键值对的抽象数据结构。在字典中一个键和一个值进行关联。这些关联的值被称为键值对。 字典中每一个键都是独一无二的&#xff0c;没有重复的。我们可以通过键来查找值&#xff0c;更新值或者删除整个键值对等…

如何定位el-tree中的树节点当父元素滚动时如何定位子元素

使用到的方法 Element 接口的 scrollIntoView() 方法会滚动元素的父容器&#xff0c;使被调用 scrollIntoView() 的元素对用户可见。 参数 alignToTop可选 一个布尔值&#xff1a; 如果为 true&#xff0c;元素的顶端将和其所在滚动区的可视区域的顶端对齐。相应的 scrollIntoV…

算法学习 day26

第二十六天 最大子数组和 53. 最大子数组和 - 力扣&#xff08;LeetCode&#xff09; 动态规划问题 class Solution {public int maxSubArray(int[] nums) {int len nums.length;int[] dp new int[len];dp[0] nums[0];int res dp[0];for(int i 1; i < len; i){dp[i] …

Docker 可视化面板 ——Portainer

Portainer 是一个非常好用的 Docker 可视化面板&#xff0c;可以让你轻松地管理你的 Docker 容器。 官网&#xff1a;Portainer: Container Management Software for Kubernetes and Docker 【Docker系列】超级好用的Docker可视化工具——Portainer_哔哩哔哩_bilibili 环境 …

OpenCV C++ 图像 批处理 (批量调整尺寸、批量重命名)

文章目录 图像 批处理(调整尺寸、重命名)图像 批处理(调整尺寸、重命名) 拿着棋盘格,对着相机变换不同的方角度,采集十张以上(以10~20张为宜);或者棋盘格放到桌上,拿着相机从不同角度一通拍摄。 以棋盘格,第一个内焦点为坐标原点,便于计算世界坐标系下三维坐标; …

远程文件包含演示

远程文件包含 基本介绍 受害机器 10.9.47.181 攻击者机器1 10.9.47.41 攻击者机器2 10.9.47.217 实现过程 受害者机器开启phpstudy 并且开启允许远程连接 攻击者机器1上有一个文件&#xff0c;内容是phpinfo(); 攻击者机器1提供web服务使得受害者机器能够访问到攻击者…

庖丁解牛:NIO核心概念与机制详解 02 _ 缓冲区的细节实现

文章目录 PreOverview状态变量概述PositionLimitCapacity演示&#xff1a; 观察变量 访问方法get() 方法put()方法类型化的 get() 和 put() 方法 缓冲区的使用&#xff1a;一个内部循环 Pre 庖丁解牛&#xff1a;NIO核心概念与机制详解 01 接下来我们来看下缓冲区内部细节 Ov…

如何学习算法

在不知其所以然的情况下&#xff0c;算法只是一堆离散的机械步骤&#xff0c;缺少背后的思想的支撑&#xff0c; 这些步骤之间就没有一个本质层面上的关联&#xff08;先知亚里士多德早就指出&#xff1a;学习即联接&#xff09;。 所以就跟背历史书也没多大区别。然而&#xf…

IPO解读丨高处不胜寒,澜沧古茶低头取暖?

自A股注册制改革不断深化并全面落地后&#xff0c;不少意欲登陆资本市场的企业转战港股。这个过程中&#xff0c;诞生了很多以“港股”为前缀的“第一股”——“白酒第一股”珍酒李渡、“水果零售第一股”百果园、“智能驾驶第一股”知行汽车、“运动科技第一股”Keep…… 由A…

实现CAS自旋锁

CAS 在高并发场景&#xff0c;可以使用加锁、CAS来保证原子性&#xff0c;但是加锁是很重量级的操作&#xff0c;CAS类似于乐观锁CAS &#xff08; Compare and swap &#xff09;比较并交换&#xff0c;是实现并发算法时常用到的技术&#xff0c;包含三个操作数&#xff1a;内…

力扣刷题-二叉树-完全二叉树的节点个数

222.完全二叉树的节点个数 给出一个完全二叉树&#xff0c;求出该树的节点个数。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,6] 输出&#xff1a;6 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;0 示例 3&#xff1a; 输入&#xff1a;root [1]…

springMvc中的拦截器【巩固】

先实现下想要的拦截器功能 package com.hmdp.utils;import com.hmdp.entity.User; import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.Ht…

Pandas get_dummies用法

get_dummies 是 pandas 实现one hot encode的方式 ​  one-hot的基本思想&#xff1a;将离散型特征的每一种特征取值都看成一种状态&#xff0c;若指定离散特征中有N个 不相同的取值&#xff0c;那么我们就可以将该特征抽象成N种不同的状态&#xff0c;one-hot编码保证了每一…

10 Redis的持久化

Redis支持RDB和AOF两种持久化机制 1、RDB(Redis DataBase) 是对命令的全量快照随着key的数量增大&#xff0c;那么写入磁盘的开销也会越来越大 2、RDB文件的生成是否会阻塞主线程 save: 使用save的方式会阻塞主线程&#xff0c;影响redis的性能 bgsave: 一般情况下不会阻塞…

05-networkX-结构洞计算

教程仓库地址&#xff1a;github networkx_tutorial import networkx as nx import matplotlib.pyplot as pltimport pandas as pd import networkx as nxdf pd.read_csv(./df.csv,index_col0) df.head()AB0H04N5H04N71G06F3G02F12G06F3H03K173G02F1H03K174NaNNaN # 检查 A 和…

C语言模拟实现Liunx操作系统与用户之间的桥梁shell(代码详解)

什么是shell&#xff1f; Shell&#xff08;壳&#xff09;是指命令行界面&#xff08;CLI&#xff09;或脚本语言&#xff0c;它为用户提供了与操作系统交互的方式。它是一个程序&#xff0c;从用户那里接收命令&#xff0c;并通过与操作系统内核交互来执行这些命令。Shell充当…