第八章 Hibernate数据操作技巧
第八章 Hibernate数据操作技巧
8.1 分组统计数据
语法:[select]... from ...[where] [group by...[having...]] [order by...]
8.1.1 聚合函数
1、count():统计记录数
例:Long count=(Long) session.createQuery("select count(*) from Dept d").uniqueResult();
System.out.println("记录条数:"+count);
2、sum():求和
例:Double salSum=(Double) session.createQuery("select sum(e.sal) from Emp e ").uniqueResult();
System.out.println("求和:"+salSum);
3、min():求最小值
例:Double sal1=(Double) session.createQuery("select min(e.sal) from Emp e").uniqueResult();
System.out.println("最小值:"+sal1);
4、max():求最大值
例:Double sal2=(Double) session.createQuery("select max(e.sal) from Emp e").uniqueResult();
System.out.println("最大值:"+sal2);
5、avg():求平均值
例:Double sal3=(Double) session.createQuery("select avg(e.sal) from Emp e").uniqueResult();
System.out.println("平均值:"+sal3);
8.1.2 分组查询
GROUP BY...HAVING...
例1 :按职位统计员工个数
List<Object[]> list=session.createQuery("select job,count(e) from Emp e group by job").list();
for(Object[] obj:list){
System.out.println(obj[0]+","+obj[1]);
}
例2: 统计各个部门的平均工资
Iterator<Object[]> it=session.createQuery
("select e.dept.dname,avg(e.sal) from Emp e group by e.dept.dname").list().iterator();
Object[] obj=null;
while(it.hasNext()){
obj=it.next();
System.out.println(obj[0]+","+obj[1]);
}
8.2 子查询
8.2.1 子查询关键字
all 子查询语句返回所有记录
any 子查询语句返回任意一条记录
some 与any相同
in 与=any相同
exists 子查询语句知识返回一条记录
例1:查询所有员工工资都小于5000的部门
List<Dept> list=session.createQuery("from Dept d where 5000>all(select e.sal from d.emps e)").list();
for(Dept dept:list){
System.out.println(dept.getDname());
}
例2:查询至少有一位职员工资低于5000的部门
List<Dept> list=session.createQuery("from Dept d where 5000>any(select e.sal from d.emps e)").list();
for(Dept dept:list){
System.out.println(dept.getDname());
}
例3: 查询所有员工工资正好是5000的部门
List<Dept> list=session.createQuery("from Dept d where 5000=any(select e.sal from d.emps e)").list();
for(Dept dept:list){
System.out.println(dept.getDname());
}
例4:查询至少有一位员工的部门
List<Dept> list=session.createQuery("from Dept d where exists (from d.emps)").list();
for(Dept dept:list){
System.out.println(dept.getDname());
}
8.2.2 操作集合的函数或属性
size(),size 获取集合中元素的个数
minIndex(),minIndex 对于建立了索引的集合,获得最小的索引
maxIndex(),maxIndex 对于建立了索引的集合,获得最大的索引
minElement(),minElement 对于包含基本类型元素的集合,获得集合中取值最小的元素
maxElement(),maxElement 对于包含基本类型元素的集合,获得集合中取值最大的元素
elements() 获取集合中所有的元素
例1:查询指定员工所在部门
Emp emp=new Emp();
emp.setEmpno(1);
List<Dept> list=session.createQuery("from Dept d where ? in elements(d.emps)")
.setParameter(0, emp).list();
for(Dept dept:list){
System.out.println(dept.getDname());
}
例2: 查询员工个数大于5的部门
List<Dept> list=session.createQuery("from Dept d where d.emps.size>5").list();
for(Dept dept:list){
System.out.println(dept.getDname());
}
8.3 原生SQL查询和命名查询
8.3.1 原生SQL查询
例:查询指定工作Job和包含E字母的员工编号和姓名
Query query=session.createSQLQuery(
"select * from EMP where ENAME like :ename and JOB=:job").setString("ename", "%E%").setString("job", "SALESMAN");
List<Object[]> list=query.list();
for(Object[] obj:list){
System.out.println(obj[0]+","+obj[1]);
}
addEntity()方法
例:查询指定工作Job和包含E字母的员工编号和姓名
Query query=session.createSQLQuery(
"select * from EMP where ENAME like :ename and JOB = :job").addEntity(Emp.class).setString("ename", "%E%").setString("job", "SALESMAN");
List<Object[]> list=query.list();
for(Object[] obj:list){
System.out.println(obj[0]+","+obj[1]);
}
addJoin()方法
例:查询指定职位的员工,输出员工姓名和部门名称
String sql="select {e.*},{d.*} from EMP e join DEPT d on d.DEPTNO=e.DEPTNO where e.JOB=:job";
Query query=session.createSQLQuery(sql).addEntity("e",Emp.class).addJoin("d", "e.dept").setString("job", "SALESMAN");
List<Object[]> list=query.list();
Emp emp=null;
Dept dept=null;
for(Object[] obj:list){
System.out.println(obj[0]+","+obj[1]);
emp=(Emp) obj[0];
dept=(Dept) obj[1];
System.out.println(emp.getEname()+","+dept.getDname());
}
8.3.2 命名查询
8.3.2.1 HQL查询语句的命名查询
例:Emp.hbm.xml
<query name="findEmpByJob">
<![CDATA[
from Emp e where e.job=:job
]]>
</query>
测试代码:
List<Emp> list=session.getNamedQuery("findEmpByJob").setString("job", "SALESMAN").list();
for(Emp emp:list){
System.out.println(emp.getEname()+","+emp.getJob());
}
8.3.2.2 原生SQL查询语句的命名查询
例1:Emp.hbm.xml
<sql-query name="selectEmpByJob">
<return alias="e" class="com.entity.Emp"></return>
select {e.*} from EMP e where e.job=:job
</sql-query>
测试代码:
List<Emp> list=session.getNamedQuery("selectEmpByJob").setString("job", "SALESMAN").list();
for(Emp emp:list){
System.out.println(emp.getEname()+","+emp.getJob());
}
例2:Emp.hbm.xml
<sql-query name="selectEmpByJobJoinDept">
<return alias="e" class="com.entity.Emp"></return>
<return-join alias="d" property="e.dept"></return-join><!--return-join用于持久化类之间的连接 alias用于指定别名 property用于指定属性名称 -->
select {e.*},{d.*} from EMP e join DEPT d on d.DEPTNO=e.DEPTNO where e.JOB=:job
</sql-query>
测试代码:
List<Object[]> list=session.getNamedQuery("selectEmpByJobJoinDept").setString("job", "SALESMAN").list();
Emp emp=null;
Dept dept=null;
for(Object[] obj:list){
System.out.println(obj[0]+","+obj[1]);
emp=(Emp) obj[0];
dept=(Dept) obj[1];
System.out.println(emp.getEname()+","+dept.getDname());
}
8.4 BLOB和CLOB类型
8.4.1 映射方法
大对象类型映射
byte[] BLOB
java.lang.String CLOB
java.sql.Clob CLOB
java.sql.BLOB BLOB
1、字符串大对象声明为java.lang.String,二进制大对象声明为byte[]类型
创建实体类和映射文件
在类路劲下创建一个为file.txt的文件
使用setTclob("插入文本")方法赋值 ,把二进制对象BLOB类型映射为java类型的byte[],需要准备字节数组使用setTblob(byteArray)方法赋值
查询使用obj.getTblob方法获取字节数组,通过文件输出流FileOutputStream把字节数组输出到文件中
2、字符串大对象声明为java.sql.Clob,二进制大对象声明为java.lang.Blob类型
创建实体类和映射文件
在类路劲下创建一个为file.txt的文件
从表中按主键读取一天记录
例:Bigobject_2 big=(Bigobject_2) session.get(Bigobject_2.class, 28);
if(big.getTclob()!=null){
try {
Reader reader = big.getTclob().getCharacterStream();
char[] charray=new char[1];
StringBuffer builder=new StringBuffer();
while(reader.read(charray)!=-1){
builder.append(new String(charray));
}
System.out.println(builder.toString().trim());
reader.close();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
if(big.getTblob()!=null){
try {
InputStream in=big.getTblob().getBinaryStream();
FileOutputStream fos=new FileOutputStream("file.txt");
int b=-1;
while((b=in.read()) !=-1){
fos.write(b);
}
fos.close();
in.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
第八章 Hibernate数据操作技巧的更多相关文章
- Hibernate入门(4)- Hibernate数据操作
Hibernate加载数据 Session.get(Class clazz, Serializable id) clazz:需要加载对象的类,例如:User.class id:查询条件(实现了序列化接 ...
- Hibernate的数据操作(4.*以上版本)
Hibernate的基本数据操作 适用于4.* ..sessionFactory的创建区别 public class NewsTest { private Session session = null ...
- 第八章| 2. MySQL数据库|数据操作| 权限管理
1.数据操作 SQL(结构化查询语言),可以操作关系型数据库 通过sql可以创建.修改账号并控制账号权限: 通过sql可以创建.修改数据库.表: 通过sql可以增删改查数据: 可以通过SQL语句中 ...
- python/numpy/pandas数据操作知识与技巧
pandas针对dataframe各种操作技巧集合: filtering: 一般地,使用df.column > xx将会产生一个只有boolean值的series,以该series作为dataf ...
- 用Excel做出比肩任务管理软件的操作技巧
用Excel做出比肩任务管理软件的操作技巧 在项目管理中,网上有各种各样的工具可以选择,到底用哪个,曾一度困扰着我.我是一个有轻度强迫症的人,总是喜欢试用各种各样的系统,以比较他们之间的不同,试图选择 ...
- [SQL]SQL语言入门级教材_SQL数据操作基础(二)
SQL数据操作基础(初级) netnova 于 -- :: 加贴在 数据库探讨: 为了建立交互站点,你需要使用数据库来存储来自访问者的信息.例如,你要建立一个职业介绍服务的站点,你就需要存储诸如个人简 ...
- vim常用操作技巧与配置
vi是linux与unix下的常用文本编辑器,其运行稳定,使用方便,本文将分两部分对其常用操作技巧和配置进行阐述,其中参考了网上的一些文章,对作者表示感谢 PART1 操作技巧 说明: 以下的例子中 ...
- 转:Mac操作技巧 | "键盘侠"必备快捷键
看到一篇网友整理的比较好的“Mac操作技巧 | "键盘侠"必备快捷键”,转载过来分享给大家!希望能有帮助. 更多专题,可关注小编[磨人的小妖精],查看我的文章,也可上[风云社区 S ...
- Python:文件操作技巧(File operation)(转)
Python:文件操作技巧(File operation) 读写文件 # ! /usr/bin/python # -*- coding: utf8 -*- spath = " D:/dow ...
随机推荐
- Java(基础)的类与变量
Java的类与成员变量 在我们学习编程语言中,需要灵活自用,那么怎么来灵活的将所有的函数属性来调用来实现完整的工程呢? 所以我们需要认识到类和变量的定义 1.类是什么? 类是抽象的概念,而对象就是类的 ...
- i++与++i陷阱
对于++i与i++编程必不可少,它们的区别:一般人只知道++i是先将i加一再进行其他操作,i++是先将i进行其他操作,再将其加一. 但是对于i++其中的执行过程,语言环境很关键.先来两个程序,看结果是 ...
- Vue.js组件之同级之间的通信
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 1671: [Usaco2005 Dec]Knights of Ni 骑士
1671: [Usaco2005 Dec]Knights of Ni 骑士 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 254 Solved: 163 ...
- java-信息安全(四)-数据签名、数字证书
概述 信息安全基本概念: 数字签名 数字证书 数字签名 数字签名(又称公钥数字签名.电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.一套数字签名 ...
- LINQ笔记
LINQ概述 语言集成查询(Language intergrated Query,LINQ)在C#编程语言中集成了查询语法. 可以使用相同的语法访问不同的数据源 提供了不同数据源的抽象层,所有可以使用 ...
- SignalR的一点点东西
JS部分 $.connection.hub.start().done(function () { alert(ok); }).fail(function (error) { alert(error); ...
- mybatis基础学习2---(resultType和resultMap的用法和区别)和setting的用法
1:resultType和resultMap两者只能有一个成立 2:resultMap可以解决复杂查询时的映射问题 3:使用 resultType使用 ------------------------ ...
- IIS 部署ASP.Net, WebAPI, Restful API, PUT/DELETE 报405错解决办法, webapi method not allowed 405
WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在I ...
- 完全关闭IIS日志,包括System32下的LogFile
早上突然发现网站访问不了了,登陆服务器一看,是C盘满了. 查一看,是IIS产生了70多G的日志,但明明已关闭日志了,还是会产生. 产生的目录在:C:\Windows\System32\LogFiles ...