hibernate11--Criteria查询

public class EmpTest {
    Session session =null;
    Transaction transaction=null;
    @Before
    public  void  before(){
         session = HibernateSessionUtil.getCurrentSession();
         transaction= session.beginTransaction();
    }
    /**
     * Criteria 查询接口:完全是面向对象的思想来 操作数据库!
     * 看不到sql看不到hql!
     * 01.查询所有的部门信息
     */
    @Test
    public  void  test01(){
    Criteria criteria=session.createCriteria(Dept.class);   //createQuery("from Dept");
        List<Dept>list = criteria.list();
        for (Dept dept : list) {
            System.out.println(dept);
        }
    }
    /**
     * 02.查询指定的部门信息     eq(属性名,属性值)
     * Restrictions:给我们的查询增加条件
     *      001.Restrictions中的方法都是静态的
     *      002.方法的返回是都是    Criterion或者其实现类
     */
    @Test
    public  void  test02(){
        Criteria criteria=session.createCriteria(Dept.class);   //createQuery("from Dept");
        criteria.add(Restrictions.eq("deptName", "研发部")); //给查询增加条件
        Dept dept = (Dept) criteria.uniqueResult();
        System.out.println(dept);
    }
    /**
     * 03.查询员工薪水大于10k的    gt(属性名,属性值)
     */
    @Test
    public  void  test03(){
        Criteria criteria=session.createCriteria(Emp.class);
        criteria.add(Restrictions.gt("salary", 10000d)); //给查询增加条件
         List<Emp> list = criteria.list();
         for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 04.查询员工薪水大于5k的  小于100k   bw(属性名,属性值1,属性值2)
     */
    @Test
    public  void  test04(){
        Criteria criteria=session.createCriteria(Emp.class);
        criteria.add(Restrictions.between("salary", 5000d, 100000d)); //给查询增加条件
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }    
    /**
     * 05.查询没有部门的员工     dept是我们Emp类中的一个域属性  对象为null  使用 isNull
     */
    @Test
    public  void  test05(){
        Criteria criteria=session.createCriteria(Emp.class);
        criteria.add(Restrictions.isNull("dept")); //给查询增加条件
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 06.查询没有员工的 部门    emps是我们Dept类中的一个集合    集合的size=0   使用 isEmpty
     */
    @Test
    public  void  test06(){
        Criteria criteria=session.createCriteria(Dept.class);
        criteria.add(Restrictions.isEmpty("emps")); //给查询增加条件
        List<Dept> list = criteria.list();
        for (Dept dept : list) {
            System.out.println(dept);
        }
    }    
    /**
     * 07.查询 员工姓名是  员工1  或者 员工2的信息
     *   两种情况  使用or
     */
    @Test
    public  void  test07(){
        Criteria criteria=session.createCriteria(Emp.class);
        //给查询增加条件
        criteria.add(Restrictions.or
                (Restrictions.eq("empName", "员工1"),
                Restrictions.eq("empName", "员工2")));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }    
    /**
     * 08.查询 员工姓名是  员工1  或者 员工2的信息
     *   两种情况  使用in(属性名,集合)
     */
    @Test
    public  void  test08(){
        Criteria criteria=session.createCriteria(Emp.class);
        List<String> names=new ArrayList<>();
        names.add("员工1");
        names.add("员工2");
        //给查询增加条件
        criteria.add(Restrictions.in("empName", names));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 09.查询 员工姓名是  员工1  或者 员工2 ,员工3  员工4 的信息
     *   两种情况  使用in(属性名,集合)
     */
    @Test
    public  void  test09(){
        Criteria criteria=session.createCriteria(Emp.class);
        List<String> names=new ArrayList<>();
        names.add("员工1");
        names.add("员工2");
        names.add("员工3");
        names.add("员工4");
        //给查询增加条件
        criteria.add(Restrictions.in("empName", names));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }    
    /**
     * 10.查询 员工姓名是  员工1  或者 员工2 ,员工3  员工4 的信息
     *
     *  Restrictions.disjunction()返回一个Disjunction对象
     *  Disjunction 继承了Junction
     *  Junction中有一个add()
     *   底层代码
     *  public Junction add(Criterion criterion) {
        criteria.add(criterion);
        return this;
       }
     */
    @Test
    public  void  test10(){
        Criteria criteria=session.createCriteria(Emp.class);
        //给查询增加条件
        criteria.add(Restrictions.disjunction()
                .add(Restrictions.eq("empName", "员工1"))
                .add(Restrictions.eq("empName", "员工2"))
                .add(Restrictions.eq("empName", "员工3"))
                .add(Restrictions.eq("empName", "员工4"))
                );
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 11.查询 员工姓名包含 A 的员工信息
     *    like  模糊查询
     */
    @Test
    public  void  test11(){
        Criteria criteria=session.createCriteria(Emp.class);
        //给查询增加条件
        criteria.add(Restrictions.like("empName", "%A%"));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 12.查询 员工姓名包含 A/a 的员工信息
     *    ilike  模糊查询    忽略大小写
     */
    @Test
    public  void  test12(){
        Criteria criteria=session.createCriteria(Emp.class);
        //给查询增加条件
        criteria.add(Restrictions.ilike("empName", "%A%"));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }    
    /**
     * 13.查询 员工姓名包含 A 的员工信息
     *    like  模糊查询
     *    MatchMode:  我们value值出现的位置    可以替换%
     *    MatchMode.ANYWHERE:前后
     *    MatchMode.END:后
     *    MatchMode.START:前
     */
    @Test
    public  void  test13(){
        Criteria criteria=session.createCriteria(Emp.class);
        //给查询增加条件
        criteria.add(Restrictions.like("empName", "A",MatchMode.ANYWHERE));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }    
    /**
     * 14.聚合函数   和 投影查询    Projections
     *
     * 查询 薪水的最大值 最小值   总薪水 和平均薪水
     * criteria.setProjection   是赋值操作
     * 如果不清空Projection
     * 之前给的值   会带入下次的查询
     */
    @Test
    public  void   test14(){
        Criteria criteria = session.createCriteria(Emp.class);
        criteria.setProjection(
                Projections.projectionList()
                .add(Projections.max("salary"))
                .add(Projections.min("salary"))
                .add(Projections.sum("salary"))
                .add(Projections.avg("salary"))
                );
        //criteria.setProjection(null);   清空所有的约束
        List<Object[]> list = criteria.list();
        for (Object[] objects : list) {
            System.out.println("最大薪水:"+objects[0]);
            System.out.println("最小薪水:"+objects[1]);
            System.out.println("总薪水:"+objects[2]);
            System.out.println("平均薪水:"+objects[3]);
        }
    }
    /**
     * 15. 分页查询
     *   查询姓名中 包含 "员工" 的  并且 按照 薪水 降序排列
     */
    @Test
    public  void   test15(){
        //查询总记录数
        int count=((Long)session.createCriteria(Emp.class)
                .add(Restrictions.like("empName", "员工",MatchMode.ANYWHERE))
                .setProjection(Projections.count("empName")).uniqueResult()).intValue();
        System.out.println("总记录数是:"+count);
        //当前页
        int  pageIndex=1;
        //页大小
        int  pageSize=4;
        //总页数
        int  totalPageSize=(count%pageSize==0)?(count/pageSize):(count/pageSize+1);
        //进行薪水的降序排列
       Criteria criteria=    session.createCriteria(Emp.class)
        .add(Restrictions.like("empName", "员工",MatchMode.ANYWHERE))
        .addOrder(Order.desc("salary"));
       //设置 当前页 以及页大小
       List<Emp> list = criteria.setFirstResult((pageIndex-1)*pageSize).setMaxResults(pageSize).list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 16:面试题
     * DetachedCriteria和 Criteria的区别
     * 相同点:都能用来 做查询操作
     * 不同点:
     *    01.DetachedCriteria在创建的时候 不需要session!
     *    02.真正执行查询的时候getExecutableCriteria(session)才使用session
     *    03.DetachedCriteria自身可以作为一个参数
     *
     *  薪水  大于    平均值的员工信息
     */
    @Test
    public  void   test16(){
        //得到DetachedCriteria对象
        DetachedCriteria criteria= DetachedCriteria.forClass(Emp.class)
         .setProjection(Projections.avg("salary"));
        //执行查询
        double  avg=(double) criteria.getExecutableCriteria(session).uniqueResult();
        System.out.println("薪水的平均值是:"+avg);
        //薪水 大于    平均值的员工信息
        List<Emp> list = session.createCriteria(Emp.class).add(
                Property.forName("salary").gt(criteria)).list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
}
public class EmpTest { Session session =null; Transaction transaction=null; @Before public  void before(){ session = HibernateSessionUtil.getCurrentSession(); transaction= session.beginTransaction(); } /** * Criteria 查询接口:完全是面向对象的思想来 操作数据库! * 看不到sql看不到hql! * 01.查询所有的部门信息 */ @Test public  void test01(){ Criteria criteria=session.createCriteria(Dept.class);   //createQuery("from Dept");
        List<Dept>list = criteria.list();
        for (Dept dept : list) {
            System.out.println(dept);
        }
    }
    /**
     * 02.查询指定的部门信息     eq(属性名,属性值)
     * Restrictions:给我们的查询增加条件
     *      001.Restrictions中的方法都是静态的
     *      002.方法的返回是都是    Criterion或者其实现类
     */
    @Test
    public  void  test02(){
        Criteria criteria=session.createCriteria(Dept.class);   //createQuery("from Dept");
        criteria.add(Restrictions.eq("deptName", "研发部")); //给查询增加条件
        Dept dept = (Dept) criteria.uniqueResult();
        System.out.println(dept);
    }
    /**
     * 03.查询员工薪水大于10k的    gt(属性名,属性值)
     */
    @Test
    public  void  test03(){
        Criteria criteria=session.createCriteria(Emp.class);
        criteria.add(Restrictions.gt("salary", 10000d)); //给查询增加条件
         List<Emp> list = criteria.list();
         for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 04.查询员工薪水大于5k的  小于100k   bw(属性名,属性值1,属性值2)
     */
    @Test
    public  void  test04(){
        Criteria criteria=session.createCriteria(Emp.class);
        criteria.add(Restrictions.between("salary", 5000d, 100000d)); //给查询增加条件
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
/**
     * 05.查询没有部门的员工     dept是我们Emp类中的一个域属性  对象为null  使用 isNull
     */
    @Test
    public  void  test05(){
        Criteria criteria=session.createCriteria(Emp.class);
        criteria.add(Restrictions.isNull("dept")); //给查询增加条件
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 06.查询没有员工的 部门    emps是我们Dept类中的一个集合    集合的size=0   使用 isEmpty
     */
    @Test
    public  void  test06(){
        Criteria criteria=session.createCriteria(Dept.class);
        criteria.add(Restrictions.isEmpty("emps")); //给查询增加条件
        List<Dept> list = criteria.list();
        for (Dept dept : list) {
            System.out.println(dept);
        }
    }
/**
     * 07.查询 员工姓名是  员工1  或者 员工2的信息
     *   两种情况  使用or
     */
    @Test
    public  void  test07(){
        Criteria criteria=session.createCriteria(Emp.class);
        //给查询增加条件
        criteria.add(Restrictions.or
                (Restrictions.eq("empName", "员工1"),
                Restrictions.eq("empName", "员工2")));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
/**
     * 08.查询 员工姓名是  员工1  或者 员工2的信息
     *   两种情况  使用in(属性名,集合)
     */
    @Test
    public  void  test08(){
        Criteria criteria=session.createCriteria(Emp.class);
        List<String> names=new ArrayList<>();
        names.add("员工1");
        names.add("员工2");
        //给查询增加条件
        criteria.add(Restrictions.in("empName", names));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 09.查询 员工姓名是  员工1  或者 员工2 ,员工3  员工4 的信息
     *   两种情况  使用in(属性名,集合)
     */
    @Test
    public  void  test09(){
        Criteria criteria=session.createCriteria(Emp.class);
        List<String> names=new ArrayList<>();
        names.add("员工1");
        names.add("员工2");
        names.add("员工3");
        names.add("员工4");
        //给查询增加条件
        criteria.add(Restrictions.in("empName", names));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
/**
     * 10.查询 员工姓名是  员工1  或者 员工2 ,员工3  员工4 的信息
     *
     *  Restrictions.disjunction()返回一个Disjunction对象
     *  Disjunction 继承了Junction
     *  Junction中有一个add()
     *   底层代码
     *  public Junction add(Criterion criterion) {
        criteria.add(criterion);
        return this;
       }
     */
    @Test
    public  void  test10(){
        Criteria criteria=session.createCriteria(Emp.class);
        //给查询增加条件
        criteria.add(Restrictions.disjunction()
                .add(Restrictions.eq("empName", "员工1"))
                .add(Restrictions.eq("empName", "员工2"))
                .add(Restrictions.eq("empName", "员工3"))
                .add(Restrictions.eq("empName", "员工4"))
                );
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 11.查询 员工姓名包含 A 的员工信息
     *    like  模糊查询
     */
    @Test
    public  void  test11(){
        Criteria criteria=session.createCriteria(Emp.class);
        //给查询增加条件
        criteria.add(Restrictions.like("empName", "%A%"));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
    /**
     * 12.查询 员工姓名包含 A/a 的员工信息
     *    ilike  模糊查询    忽略大小写
     */
    @Test
    public  void  test12(){
        Criteria criteria=session.createCriteria(Emp.class);
        //给查询增加条件
        criteria.add(Restrictions.ilike("empName", "%A%"));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
/**
     * 13.查询 员工姓名包含 A 的员工信息
     *    like  模糊查询
     *    MatchMode:  我们value值出现的位置    可以替换%
     *    MatchMode.ANYWHERE:前后
     *    MatchMode.END:后
     *    MatchMode.START:前
     */
    @Test
    public  void  test13(){
        Criteria criteria=session.createCriteria(Emp.class);
        //给查询增加条件
        criteria.add(Restrictions.like("empName", "A",MatchMode.ANYWHERE));
        List<Emp> list = criteria.list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
/**
     * 14.聚合函数   和 投影查询    Projections
     *
     * 查询 薪水的最大值 最小值   总薪水 和平均薪水
     * criteria.setProjection   是赋值操作
     * 如果不清空Projection
     * 之前给的值   会带入下次的查询
     */
    @Test
    public  void   test14(){
        Criteria criteria = session.createCriteria(Emp.class);
        criteria.setProjection(
                Projections.projectionList()
                .add(Projections.max("salary"))
                .add(Projections.min("salary"))
                .add(Projections.sum("salary"))
                .add(Projections.avg("salary"))
                );
        //criteria.setProjection(null);   清空所有的约束
        List<Object[]> list = criteria.list();
        for (Object[] objects : list) {
            System.out.println("最大薪水:"+objects[0]);
            System.out.println("最小薪水:"+objects[1]);
            System.out.println("总薪水:"+objects[2]);
            System.out.println("平均薪水:"+objects[3]);
        }
    }
    /**
     * 15. 分页查询
     *   查询姓名中 包含 "员工" 的  并且 按照 薪水 降序排列
     */
    @Test
    public  void   test15(){
        //查询总记录数
        int count=((Long)session.createCriteria(Emp.class)
                .add(Restrictions.like("empName", "员工",MatchMode.ANYWHERE))
                .setProjection(Projections.count("empName")).uniqueResult()).intValue();
        System.out.println("总记录数是:"+count);
        //当前页
        int  pageIndex=1;
        //页大小
        int  pageSize=4;
        //总页数
        int  totalPageSize=(count%pageSize==0)?(count/pageSize):(count/pageSize+1);
        //进行薪水的降序排列
       Criteria criteria=    session.createCriteria(Emp.class)
        .add(Restrictions.like("empName", "员工",MatchMode.ANYWHERE))
        .addOrder(Order.desc("salary"));
       //设置 当前页 以及页大小
       List<Emp> list = criteria.setFirstResult((pageIndex-1)*pageSize).setMaxResults(pageSize).list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
/**
     * 16:面试题
     * DetachedCriteria和 Criteria的区别
     * 相同点:都能用来 做查询操作
     * 不同点:
     *    01.DetachedCriteria在创建的时候 不需要session!
     *    02.真正执行查询的时候getExecutableCriteria(session)才使用session
     *    03.DetachedCriteria自身可以作为一个参数
     *
     *  薪水  大于    平均值的员工信息
     */
    @Test
    public  void   test16(){
        //得到DetachedCriteria对象
        DetachedCriteria criteria= DetachedCriteria.forClass(Emp.class)
         .setProjection(Projections.avg("salary"));
        //执行查询
        double  avg=(double) criteria.getExecutableCriteria(session).uniqueResult();
        System.out.println("薪水的平均值是:"+avg);
//薪水 大于    平均值的员工信息   
        List<Emp> list = session.createCriteria(Emp.class).add(
                Property.forName("salary").gt(criteria)).list();
        for (Emp emp : list) {
            System.out.println(emp);
        }
    }
}
hibernate11--Criteria查询的更多相关文章
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
		写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ... 
- NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)
		摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ... 
- Criteria查询初学者的采纳点哦
		一.Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 from Emp e group by e.dept.deptName 2.OID检索 ... 
- Criteria查询之sqlRestriction()的理解
		sqlRestriction()的理解 在Criteria查询中 使用sqlRestriction()方法来提供SQL语法作限定查询,作为where字句 查看官方给的例子,如下 List cats = ... 
- Criteria查询数据
		Criteria介绍: Criteria查询是Hibernate提供的一种查询方式,与HQL基于字符串的查询形式完全不同.Hibernate提供了org.hiberanee.Criteria 接口.o ... 
- Hibernate框架之Criteria查询
		首先给大家说说Hibernate检索方式 Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQ ... 
- Hibernate 、Hql查询和Criteria查询
		HQL查询: public Object query(String name){ Session s=null; try{ s=HibernateSessionFactory.getSession() ... 
- Hibernate框架Criteria查询
		本文章适合一些初学者 一.使用Criteria查询数据 1.条件查询 1.1:使用Criteria查询的步骤 1.使用Sess ... 
- 第九章   Criteria查询及注解
		第九章 Criteria查询及注解9.1 使用Criteria查询数据 9.1.1 条件查询 Criteria查询步骤: 1)使用session接口的cr ... 
- hibernate框架学习笔记7:HQL查询、Criteria查询简介
		HQL查询:hibernate独有的查询语言 适用于不复杂的多表查询 示例: 实体类: package domain; public class Customer { private Long cus ... 
随机推荐
- BMFont制作美术字体
			生成 Number.fnt.Number_0.png 两个文件,将其拖入Unity 相应位置,继续下一步 箭头所指就是我们要得到的最终目标,在文本处字体使用它就可以了. 在使用 Tools -> ... 
- [Web 前端]   我不再使用React.setState的3个原因
			copy from : https://blog.csdn.net/smk108/article/details/85237838 从几个月前开始,我在新开发的React组件中不再使用setState ... 
- javacript onclick事件中传递对象参数
			var user = {id:1, name:'zs', age:20}; var ele = '<a onclick="edit(' + JSON.stringify(user).r ... 
- set 容器的用法
			1.set容器的理解 所有元素都会根据元素的键值自动排序,set元素的键值就是实值,实值就是键值.set不允许两个元素有相同的键值.(set的元素不像map那样可以同时拥有实值(value)和键值(k ... 
- 【ASP.NET Core】浅说目录浏览
			何谓“浅说”?就是一句话说不完,顶多两句话就介绍完毕,然后直接给上实例的解说方式.化繁为简,从七千年前到现在,从老祖宗到咱们,一直都在追求的理想目标,尽可能把复杂的东西变成简单的. 老周告诉你一个可以 ... 
- mybatis --- 如何相互转换逗号分隔的字符串和List
			如果程序员想实现某种功能,有两条路可以走.一条就是自己实现,一条就是调用别人的实现,别人的实现就是所谓的API.而且大多数情况下,好多“别人”都 实现了这个功能.程序员有不得不在这其中选择.大部分情况 ... 
- mysql官方驱动jar
			问题描述: 在mysql5.7版本,发现登录不了,找不到原因.有人说是驱动的问题,下载最新的驱动,问题得到解决! 问题解决: 下载最新mysql-jar驱动,传统版本最新mysql-jar驱动版本5. ... 
- vim编辑器里shift + 3 出现高亮问题,怎么取消掉
			在编辑器里非编辑状态,输入: shift + 3 (#) shift + 8 (*) 会出现高亮显示,看着很不舒服, 取消方式: :noh :/aaa (随便的字母或数字都可) 
- R语言|数据特征分析
			对数据进行质量分析以后,接下来可通过绘制图表.计算某些特征量等手段进行数据的特征分析. 主要通过分布分析.对比分析.统计量分析.周期性分析.贡献度分析.相关性分析等角度进行展开. 2.1 分布分析 分 ... 
- Oracle数据库远程连接配置教程
			本人前一段时间做过Oracle数据库的相关工作.可是发现数据库的监听程序和服务名比較难搞定,并且网上也没有现成的教程.所以经过自己的探索之后将这片文章贡献给大家,如有不当之处还请谅解并请联系本人. 此 ... 
