第八章   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数据操作技巧的更多相关文章

  1. Hibernate入门(4)- Hibernate数据操作

    Hibernate加载数据 Session.get(Class clazz, Serializable id) clazz:需要加载对象的类,例如:User.class id:查询条件(实现了序列化接 ...

  2. Hibernate的数据操作(4.*以上版本)

    Hibernate的基本数据操作 适用于4.* ..sessionFactory的创建区别 public class NewsTest { private Session session = null ...

  3. 第八章| 2. MySQL数据库|数据操作| 权限管理

    1.数据操作 SQL(结构化查询语言),可以操作关系型数据库 通过sql可以创建.修改账号并控制账号权限:  通过sql可以创建.修改数据库.表:  通过sql可以增删改查数据: 可以通过SQL语句中 ...

  4. python/numpy/pandas数据操作知识与技巧

    pandas针对dataframe各种操作技巧集合: filtering: 一般地,使用df.column > xx将会产生一个只有boolean值的series,以该series作为dataf ...

  5. 用Excel做出比肩任务管理软件的操作技巧

    用Excel做出比肩任务管理软件的操作技巧 在项目管理中,网上有各种各样的工具可以选择,到底用哪个,曾一度困扰着我.我是一个有轻度强迫症的人,总是喜欢试用各种各样的系统,以比较他们之间的不同,试图选择 ...

  6. [SQL]SQL语言入门级教材_SQL数据操作基础(二)

    SQL数据操作基础(初级) netnova 于 -- :: 加贴在 数据库探讨: 为了建立交互站点,你需要使用数据库来存储来自访问者的信息.例如,你要建立一个职业介绍服务的站点,你就需要存储诸如个人简 ...

  7. vim常用操作技巧与配置

    vi是linux与unix下的常用文本编辑器,其运行稳定,使用方便,本文将分两部分对其常用操作技巧和配置进行阐述,其中参考了网上的一些文章,对作者表示感谢 PART1 操作技巧 说明: 以下的例子中  ...

  8. 转:Mac操作技巧 | "键盘侠"必备快捷键

    看到一篇网友整理的比较好的“Mac操作技巧 | "键盘侠"必备快捷键”,转载过来分享给大家!希望能有帮助. 更多专题,可关注小编[磨人的小妖精],查看我的文章,也可上[风云社区 S ...

  9. Python:文件操作技巧(File operation)(转)

    Python:文件操作技巧(File operation) 读写文件 # ! /usr/bin/python #  -*- coding: utf8 -*- spath = " D:/dow ...

随机推荐

  1. nodejs中的异步流程序控制nsync

    异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数.ajax请求等等 http://cnodejs.org/topi ...

  2. Java系统属性与Preferences API的简单介绍

    系统属性在和Preferences API都是键值对,前者只能当前应用程序中共享数据,而后者可以在用户的各个应用或用户之间共享数据. 系统属性 Java 的系统属性决定了 Java 程序实际运行的环境 ...

  3. Spring总结_02_Spring概述

    一.概念准备 1.应用程序:是能完成我们所需要功能的成品,比如购物网站.OA系统. 2.框架:是能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发:框架做一部分功能,我们自己做一部分功能,这 ...

  4. ASP.NET MVC 5 基本构成

    MVC模式简介: MVC模式两种理解:一种是表现模式,另外一种是架构模式.它将应用程序分成三个主要组件即:视图(View)控件器(Controller)模型(Model) M: Model主要是存储或 ...

  5. 基于requirejs+bluebird,50行代码实现轻巧实用的前端CMD加载器

    首先是github地址,可以用git克隆命令也可以直接在git页面下载 https://github.com/kazetotori/js-requireAsync 下载下来后目录结构是这样的 -pac ...

  6. JS实现购物车特效

    学习通过JavaScript实现类似于淘宝的购物车效果,包括商品的单选.全选.删除.修改数量.价格计算.数目计算.预览等功能. 1. 实现兼容低版本IE的getElementsByClassName( ...

  7. 腾讯云数据库团队:SQL Server 数据加密功能解析

    数据加密是数据库被破解.物理介质被盗.备份被窃取的最后一道防线:数据加密,一方面解决数据被窃取安全问题,另一方面有关法律要求强制加密数据:SQL Server 的数据加密相较于其他数据库,功能相对完善 ...

  8. 为什么用IP无法访问网站,域名可以访问?

    我们访问网站都是通过域名进行访问的,偶尔会使用网站IP进行访问,如学校通常使用IP登录教务处,但很多的时候我们无法通过ip进行访问其他网站,这就涉及到服务器的问题了. 网站都是依托在服务器上面的,而服 ...

  9. (9)集合之Set,HashSet,TreeSet

    TreeSet子类 注意事项: 1.向TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储 2.往TreeSet添加元素的时候,如果元素本身不具备自 ...

  10. 打印时鼠标键盘移动的div创建

    function createDiv(id, label, offset_left, offset_top) { $("body").append($("<div& ...