第九章   Criteria查询及注解
9.1 使用Criteria查询数据
    9.1.1 条件查询
        Criteria查询步骤:
            1)使用session接口的createCriteria()方法创建Criteria对象
            2)使用Restrictions类提供静态方法设置条件,返回Criterion对象
            3)使用Criteria接口的list()方法执行查询语句
            例:查询所有部门
            Criteria criteria=session.createCriteria(Dept.class);
                List<Dept> list=criteria.list();
                for(Dept dept:list){
                    System.out.println(dept.getDeptno()+","+dept.getDname());
                }
        查询条件:
            1、比较运算
                =                      Restrictions.eq(String propertyName,Object value)        等于
                <>                    Restrictions.ne(String propertyName,Object value)        不等于
                >                      Restrictions.gt(String propertyName,Object value)        大于
                >=                    Restrictions.ge(String propertyName,Object value)       大于等于
                <                      Restrictions.lt(String propertyName,Object value)         小于
                <=                    Restrictions.le(String propertyName,Object value)        小于等于
                is null                Restrictions.isNull(String propertyName)                      等于空
                is not null          Restrictions.isNotNull(String propertyName)                 不等于空
                例1:查询工资高于5000的员工
                    List<Emp> list=session.createCriteria(Emp.class)
                        .add(Restrictions.gt("sal", 5000D)).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEmpno()+","+emp.getEname());
                    }
                例2:查询不属于人和我部门的员工
                    List<Emp> list=session.createCriteria(Emp.class)
                        .add(Restrictions.isNull("dept")).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEname());
                    }    
            2、范围运算
                in                            Restrictions.in(String propertyName,Connection value)        
                                              Restrictions.in(String propertyName,Object[] value)
                not in                         Restrictions.not(Restrictions.in())
                between...and...          Restrictions.between(String propertyName,Object lo,Object hi)
                not between...and...    Restrictions.not(Restrictions.between())
                例1:查询职位是SALESMAN   或  MANAGER  的员工
                    List jobList=new ArrayList();
                    jobList.add("SALESMAN");
                    jobList.add("MANAGER");
                        List<Emp> list=session.createCriteria(Emp.class)
                                .add(Restrictions.in("job", jobList)).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEname()+"     "+emp.getJob());
                    }
                例2:查询工资在2000~4000之间的员工
                    List<Emp> list=session.createCriteria(Emp.class)
                            .add(Restrictions.between("sal", 2000D, 4000D)).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEname()+" "+emp.getSal());
                    }
            3、字符串模式匹配        
                        Restrictions.like(String propertyName,Object value)
                        Restrictions.like(String propertyName,Object value,MatchMode matchMode)            字符串模式匹配
                like
                        Restrictions.ilike(String propertyName,Object value)
                        Restrictions.ilike(String propertyName,String value,MatchMode matchMode)        字符串模式匹配,忽略大小写
                例1:查询姓名中包括S的员工
                    List<Emp> list=session.createCriteria(Emp.class)
                            .add(Restrictions.like("ename", "%S%")).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEname());
                    }
                例2:使用MatchMode类的静态常量进行字符串匹配
                    List<Emp> list=session.createCriteria(Emp.class)
                            .add(Restrictions.ilike("ename", "s", MatchMode.ANYWHERE)).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEname());
                    }
                MatchMode类的静态常量
                    MatchMode.START                   Restrictions.like("empName","s",MatchMode.START)          员工姓名以s开头
                    MatchMode.END                   Restrictions.like("empName","s",MatchMode.END)             员工姓名以s结尾
                    MatchMode.ANYWHERE            Restrictions.like("empName","s",MatchMode.ANYWHERE)      员工姓名包含s
                    MatchMode.EXACT                   Restrictions.like("empName","s",MatchMode.EXACT)           员工姓名等于s
            4、逻辑运算
                and             Restrictions.and(Criteria lhs,Criterion rhs)          与
                or               Restrictions.or(Criteria lhs,Criterion rhs)
                               Restrictions.disjunction()                                 或
                not             Restrictions.not(Criterion expression)                非
                例:查询职位是SALESMAN   或  MANAGER  的员工
                    List<Emp> list=session.createCriteria(Emp.class)
                            .add(Restrictions.or(Restrictions.eq("job", "SALESMAN"),
                                    Restrictions.eq("job", "MANAGER"))).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEname());
                    }
                例:查询职位是SALESMAN   或  MANAGER  或 CLERK 的员工
                    List<Emp> list=session.createCriteria(Emp.class)
                        .add(Restrictions.disjunction().add(Restrictions.eq("job", "CLERK"))
                                .add(Restrictions.eq("job", "MANAGER"))
                                .add(Restrictions.eq("job", "SALESMAN"))).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEname());
                    }
            5、集合运算    
                is empty          Restrictions.isEmpty(String propertyName)         集合为空
                is not empty    Restrictions.isNotEmpty(String propertyName)    集合不为空
                例: 查询没有员工的部门
                    List<Dept> list=session.createCriteria(Dept.class)
                            .add(Restrictions.isEmpty("emps")).list();
                    for(Dept dept: list){
                        System.out.println(dept.getDname());
                    }
    9.1.2 动态查询
9.2 排序,分页及关联
        9.2.1 排序(Order)
            例:查询工资高于4000的员工,按工资升序排列
                    List<Emp> list=session.createCriteria(Emp.class)
                            .add(Restrictions.gt("sal", 4000D))
                            .addOrder(Order.asc("sal"))
                            .addOrder(Order.desc("empno")).list();    
                    for(Emp emp:list){
                        System.out.println(emp.getEname()+","+emp.getSal());
                    }
        9.2.2 分页查询
            setFirstResult(int firstResult):设置从哪一个对象开始查询
            setMaxResults( int maxResult):设置一次最多查询出的对象个数
            例: 查询职位是SALESMAN的员工。按工资降序排列,每页显示两条记录输出第一页信息,输出总页数,总记录数,当前页号
                    Criteria criteria=session.createCriteria(Emp.class)
                            .add(Restrictions.eq("job", "SALESMAN").ignoreCase())
                            .setProjection(Projections.count("empno"));
                    Integer count=(Integer) criteria.uniqueResult();
                    //分页
                    int pageSize=2;//每页显示记录数
                    int totalpages=(count%pageSize==0)?(count/pageSize):(count/pageSize+1);//总页数
                    int pageIndex=1;
                    criteria=session.createCriteria(Emp.class)
                            .add(Restrictions.eq("job", "SALESMAN").ignoreCase())
                            .addOrder(Order.desc("sal"));
                    List<Emp> list=criteria.setFirstResult((pageIndex-1)*pageSize)
                            .setMaxResults(pageSize).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEname()+","+emp.getSal());
                    }
                    System.out.println("总页数:"+totalpages+",总记录数:"+count+",当前页号:"+pageIndex);
        9.2.3 查询唯一对象
            Query和Criteria接口执行查询的方法
                List list()                      返回List集合
                Iterator iterate()             返回Iterator迭代器        Criteria不支持
                Object uniqueResult()       返回唯一对象
                例:查询工资最高的员工
                        Emp emp=(Emp) session.createCriteria(Emp.class)
                            .add(Restrictions.isNotNull("sal"))
                            .addOrder(Order.desc("sal"))
                            .setMaxResults(1).uniqueResult();
                        System.out.println(emp.getEname()+","+emp.getSal());
                
        9.2.4 连接查询
            例:查询财务部的姓名包括A的员工
                List<Emp> list=session.createCriteria(Emp.class,"e")
                            .createAlias("dept", "d")
                            .add(Restrictions.ilike("e.ename", "a",MatchMode.ANYWHERE))
                            .add(Restrictions.eq("d.dname", "财务部").ignoreCase()).list();
                for(Emp emp:list){
                    System.out.println(emp.getEname()+","+emp.getDept().getDname());
                }
            例:查询位置子啊“东一区” 的部门及其员工数setFetchMode()设置迫切左外链接
                List<Dept> list=session.createCriteria(Dept.class,"d")
                            .setFetchMode("emps", FetchMode.JOIN)
                            .add(Restrictions.eq("d.loc", "东一区").ignoreCase()).list();
                HashSet<Dept> set=new HashSet<Dept>(list);
                for(Dept dept:set){
                    System.out.println(dept.getDname()+","+dept.getLoc()+","+dept.getEmps().size());
                }    
9.3 投影,分组及DetachedCriteria
        9.3.1 使用投影和分组
            例:查询员工姓名和入职时间
                List<Object[]> list=session.createCriteria(Emp.class)
                        .setProjection(Projections.projectionList()
                                .add(Property.forName("ename"))
                                .add(Property.forName("hiredate"))).list();
                for(Object[] obj:list){
                    System.out.println(obj[0]+","+new Date(((Timestamp) obj[1]).getDateTime()));
                }
        Projections常用聚合查询方法
            Projections.groupProperty(String propertyName)         分组
            Projections.rowCount()                                      统计记录数
            Projections.avg(String PropertyName)                   统计平均值
            Projections.max(String PropertyName)                    统计最大值
            Projections.min(String PropertyName)                     统计最小值    
            Projections.count(String PropertyName)                  统计某字段的非空记录数
            Projections.sum(String PropertyName)                    统计某一字段求和
            例:List<Object[]> list=session.createCriteria(Emp.class,"e")
                        .createAlias("e.dept", "d")
                        .setProjection(Projections.projectionList()
                                .add(Projections.groupProperty("d.dname"))
                                .add(Projections.avg("e.sal"))
                                .add(Projections.max("e.sal"))
                                .add(Projections.min("e.sal"))
                                ).list();
                for(Object[] obj:list){
                    System.out.println(obj[0]+","+obj[1]+","+obj[2]+","+obj[3]);
                }
        9.3.2 使用DetachedCriteria
                Criteria和DetachedCriteria区别
                    Criteria是由session对象创建的
                    DetachedCriteria创建不需要session对象
                例:使用DetachedCriteria查询财务部的姓名包括A的员工
                    DetachedCriteria detachedCridteria=DetachedCriteria.forClass(Emp.class,"e")
                            .createAlias("e.dept", "d")
                            .add(Restrictions.eq("d.dname", "财务部"))
                            .add(Restrictions.ilike("e.ename", "a",MatchMode.ANYWHERE));
                    List<Emp> list=detachedCridteria.getExecutableCriteria(session).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEname()+","+emp.getDept().getDname());
                    }
                例:DetachedCriteria avgSal=DetachedCriteria.forClass(Emp.class,"e")
                        .setProjection(Property.forName("sal").avg());
                    List<Emp> list=session.createCriteria(Emp.class)
                        .add(Property.forName("sal").gt(avgSal)).list();
                    for(Emp emp:list){
                        System.out.println(emp.getEname()+","+emp.getSal());
                    }
9.4 注解
        9.4.1 Hibernate注解使用步骤
            1)添加jar包
            2)使用注解配置持久化类及对象关联关系
            3)使用AAnnotationConfiguration建立回话工厂
            4)在Hibernate配置文件中声明持久化类
        9.4.2 注解配置持久化类
            @Entity                           将一个类声明为持久化类
            @Id                                声明持久化类的标识属性
            @GeneratedValue                定义标识属性的生成策略
            @Table                               为持久化类指定包    
            @UniqueConstraint             定义表的唯一约束
            @Lob                                表示属性将被持久化类化为Blob或Clob类型
            @Column                          将属性映射到
            @Transient                       忽略这些字段和属性
            
            @Table可以省略,默认值为持久化类名
            @GeneratedValue    定义标识属性的生成策略
                AUTO          根据不同数据库选择不同策略
                TABLE            使用表保存id值
                INDENITY       使用数据库自动生成主键
                SEQENCE       使用序列创建主键
                
            例:Emp.java
                    @Entity
                    @Table(name="EMP")
                    public class Emp implements Serializable{
                    @Id
                    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_emp")
                    @SequenceGenerator(name="seq_emp",sequenceName="seq_emp_id",allocationSize=1,initialValue=1)
                    private Integer empno;
                    @Column(name="ENAME")
                    private String ename;
                    @Transient
                    private String job;
                    @Transient
                    private Short mgr;
                    @Column(name="HIREDATE")
                    private Date hiredate;
                    @Transient
                    private Double sal;
                    @Transient
                    private Double comm;
                    @ManyToOne(fetch=FetchType.LAZY)
                    @JoinColumn(name="DEPTNO")
                    private Dept dept;
                    <!-- Hibernate.cfg.xml配置   -->
                测试代码:
                    SessionFactory sf=new AnnotationConfiguration().configure().buildSessionFactory();
                    Session session=sf.openSession();
                    Transaction tx=(Transaction) session.beginTransaction();
                    Emp emp=new Emp();
                    emp.setEname("test1");
                    emp.setHiredate(new Date());
                    session.save(emp);
                    tx.commit();
        9.4.3 注解配置对象关联关系
                @OneToOne          一对一
                @OneToMany        一对多
                @ManyToOne       多对一
                @ManyToMany      多对多
        9.4.4 注解配置命名查询
                例:@NamedQuery(name="selectEmp",query="from Emp where empName like:ename")

第九章 Criteria查询及注解的更多相关文章

  1. Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)

    写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...

  2. 通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile

      通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁 ...

  3. NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)

    摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...

  4. 第九章:四大组件之Broadcast Receiver

    第九章:四大组件之Broadcast Receiver   一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和 ...

  5. 《Django By Example》第九章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag 注:哈哈哈,第九章终于来啦 ...

  6. 第九章 MySQL中LIMIT和NOT IN案例

    第九章 MySQL中LIMIT和NOT IN案例 一.案例的项目 1.创建数据库语句: #创建数据库 CREATE DATABASE `schoolDB`; USE `schoolDB`; #创建学生 ...

  7. Testlink1.9.17使用方法(第九章 测试结果分析)

    第九章 测试结果分析 QQ交流群:585499566 TestLink根据测试过程中记录的数据,提供了较为丰富的度量统计功能,可以直观的得到测试管理过程中需要进行分析和总结的数据.点击首页横向导航栏中 ...

  8. 鸟哥的Linux私房菜——第九章

    视频链接,推荐看B站 土豆网:http://www.tudou.com/programs/view/XmMDbjJHJC8 B站:http://www.bilibili.com/video/av966 ...

  9. JPA criteria 查询:类型安全与面向对象

    参考:https://my.oschina.net/zhaoqian/blog/133500 一.JPA元模型概念,及使用 在JPA中,标准查询是以元模型的概念为基础的.元模型是为具体持久化单元的受管 ...

随机推荐

  1. APIJSON,让接口和文档见鬼去吧!

    我: APIJSON,让接口和文档见鬼去吧! https://github.com/TommyLemon/APIJSON 服务端: 什么鬼? 客户端: APIJSON是啥? 我: APIJSON是一种 ...

  2. 前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

    JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列 ...

  3. 团队项目中js冲突

    在我们平时的项目中,特别是模块化开发中.经常会遇到一些js冲突问题,特别是当项目复杂到一定程度的时候.比如项目中引入了相当多的类库,框架以后. 那么.我们如何去避免或者解决这类问题呢? 1.避免使用全 ...

  4. 类似于qq空间类型的评论和回复

    最近学习thinkphp,做了一个博客系统,其中感觉实现一个类似于qq空间的评论和回复功能比较复杂,所以把这次的经历记录下来,与大家共勉,具体的方法就不说了,在这里分享一下思路. 目标就是这种,关键是 ...

  5. ACM 阶乘数位数

    描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出N!的位数有多少(十进制)?   输入 首行输入n,表示有多少组测试数据(n<1 ...

  6. hdoj1421(bfs)

    bfs 练习题,简单bfs 题意:给一块地图,找出油田的块的数量,这里要考虑油田的八个方向,上下左右(左右)上(左右)下,存在则可以并在一起.@是油田,*是土地,m是行,n是列. 解题思路:用一个二维 ...

  7. 使用git克隆指定分支的代码

    今天想学习一下开源中国Android客户端的app源码,源码的Git地址:http://git.oschina.net/oschina/android-app,如下图所示: 由于Master主分支上没 ...

  8. JavaWeb之JSP技术总结

    刚接触JSP技术的时候让我想起了在大学学的Asp+VBScript,记得当时我还用aspstudy做了一个小的新闻发布系统作为期末作品,也正是在那时候在卢哥卢老师的指导下走向编程的道路,对编程越来越感 ...

  9. 参加光环国际PRINCE2培训

    挑战埃及是全球首套能够同时适配PRINCE2认证人群,PMP认证人群的项目管理沙盘演练游戏.沙盘通过使用乐高积木作为道具,通过一场互动性极强的情景模拟为全球项目经理还原了四千年前古埃及金字塔建造的情景 ...

  10. java中的基本jdbc中mvc基本示例

    数据库: 包文件: Student.java 1 package com.model; 2 3 public class Student { 4 private int id; 5 private S ...