Hibernate框架中Criteria语句

在Hibernate中有一种查询语句是Criteria查询(QBC查询),今天呢 我们就一个个的详细的跟大家一起探讨Criteria语句的相关知识点

案例前的准备

 

//插入测试数据,构建数据库
    public static void insertInfo(){
        //获取Session 
        Session session=HibernateUtil.currentSession();
        
        //开启事务
        Transaction tx = session.beginTransaction();
        
        //构建班级
        Grade grade=new Grade("超级无敌宇宙班","炒鸡不错");
        //构建第二个班级
        Grade grade2=new Grade("超级班","很不错");
        //构建学生
        Student stu1=new Student("高冷小伙3","");
        Student stu2=new Student("高冷小伙4","");
        //指定关系
        grade.getStus().add(stu1);
        grade.getStus().add(stu2);
        //保存班级
        session.save(grade);
        session.save(grade2);
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

 

 

案例一:查询所有学生信息(Criteria)

//使用Criteria语句查询所有学生信息
    public static void selectStu(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Student.class);
        List<Student> list = criteria.list();
        for (Student stu : list) {
            System.out.println(stu.getSname());
            System.out.println(stu.getSex());
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

经过以上语句我们可以看到的查询结果如下:

 

 

 

案例二:查询男生的信息(带条件查询)(Restrictions.eq())

//使用Criteria语句带条件查询学生信息
    public static void selectStuWhere(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Student.class).add(Restrictions.eq("sex", ""));
        List<Student> list = criteria.list();
        for (Student stu : list) {
            System.out.println(stu.getSname());
            System.out.println(stu.getSex());
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

查询结果如下:

 

案例三:关联查询,查询班级下的学生信息(Restrictions.eq())

//查询班级为超级无敌宇宙班的班级学生信息
    public static void selectStuWhereGrade(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Grade.class).add(Restrictions.eq("gname", "超级无敌宇宙班"));
        List<Grade> list = criteria.list();
        for (Grade gra : list) {
            for(Student stu:gra.getStus()){
                System.out.println(stu.getSname());
            }
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

查询结果如图:

 

案例四:关联查询,查询班级下的学生信息(取别名的方式)(Restrictions.eq())

//查询班级为超级无敌宇宙班的班级学生信息(方式二:取别名)
    public static void selectStuWhereGradeAsName(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Student.class);
        //取别名
        criteria.createAlias("grade", "g");
        Criterion criterion= Restrictions.eq("g.gname", "超级无敌宇宙班");
        criteria.add(criterion);
        List<Student> list = criteria.list();
        for (Student stu : list) {
            System.out.println(stu.getSname());
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

查询结果如图

 

 

案例五:范围查询   查询名字是高冷小伙3和高冷小伙4的学生信息(Restrictions.in())

//范围查询   查询名字是高冷小伙3和高冷小伙4的学生信息
    public static void selectStuWhereName(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Student.class);
        List lists=new ArrayList();
        lists.add("高冷小伙3");
        lists.add("高冷小伙4");
        Criterion criterion= Restrictions.in("sname", lists);
        criteria.add(criterion);
        List<Student> list = criteria.list();
        for (Student stu : list) {
            System.out.println(stu.getSname());
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

查询结果如图

 

案例六:模糊查询,查询学生姓名中有3的学生名称(Restrictions.like())

//模糊查询,查询学生姓名中有3的学生名称
    public static void selectStuLike(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Student.class);
        //如果是  ilike的话是不区分大小写的    
        //Criterion criterion= Restrictions.like("sname", "%3%");
        //或者是采用如下方式,则可以省略%%
        Criterion criterion= Restrictions.like("sname", "3",MatchMode.ANYWHERE);
        criteria.add(criterion);
        
        List<Student> list = criteria.list();
        for (Student stu : list) {
            System.out.println(stu.getSname());
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

查询结果如图

 

 

案例七:逻辑控制  多条件查询  查询性别为男  名字中有  3的学生信息(Restrictions.and())

//逻辑控制  多条件查询  查询性别为男  名字中有  3的学生信息
    public static void selectStuManyWhere(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Student.class);
        
        //条件1
        Criterion c1= Restrictions.like("sname", "3",MatchMode.ANYWHERE);
        //条件2
        Criterion c2= Restrictions.eq("sex","");
        //整合条件  and
        Criterion criterion=Restrictions.and(c1, c2);
        
        criteria.add(criterion);
        
        List<Student> list = criteria.list();
        for (Student stu : list) {
            System.out.println(stu.getSname());
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

 查询结果如图

 

案例八:非空检查  查询没有学生的班级(Restrictions.isEmpty())

//非空检查  查询没有学生的班级
    public static void selectNotStuGrade(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Grade.class);
        
        Criterion criterion=Restrictions.isEmpty("stus");
        
        criteria.add(criterion);
        
        List<Grade> list = criteria.list();
        for (Grade grade : list) {
            System.out.println(grade.getGname());
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

查询结果如图

 

案例九:动态查询 查询  学号大于0 名字中有3的学生信息(Criteria.add())

 

//动态查询 查询  学号大于0 名字中有3的学生信息
    public static void selectStuDynamic(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Student.class);
        
        //准备两个变量当成是前台穿过来的条件
        Integer stuno=0;
        String stuname="3";
        
        //动态拼接
        if(stuno!=null){
            criteria.add(Restrictions.gt("sid",stuno));
        }
        if(stuname!=null){
            criteria.add(Restrictions.ilike("sname",stuname,MatchMode.ANYWHERE));
        }
        
        List<Student> list = criteria.list();
        for (Student stu : list) {
            System.out.println(stu.getSname());
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

查询结果如图

 

案例十:排序  查询学号大于0的学生按照学号降序排列(criteria.addOrder())

 

//排序  查询学号大于0的学生按照学号降序排列
    public static void selectStuOraderby(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Student.class);
        
        Criterion criterion=Restrictions.gt("sid", 0);
        
        criteria.add(criterion).addOrder(Order.desc("sid"));
        
        
        List<Student> list = criteria.list();
        for (Student stu : list) {
            System.out.println(stu.getSname());
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

查询结果如图

 

案例十一:分页查询  查询第二页数据 每页显示一条记录(criteria.setMaxResults()和criteria.setFirstResult())

//分页查询  查询第二页数据 每页显示一条
    public static void selectStuPage(){
        //获取session
        Session session=HibernateUtil.currentSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //使用Criteria查询
        Criteria criteria = session.createCriteria(Student.class);
        
        /*//显示总记录数
        Projection projection = Projections.count("sid");
        criteria.setProjection(projection);
        int count = ((Long)criteria.uniqueResult()).intValue();
        System.out.println("总记录数为:"+count);*/
                
        //准备两个变量
        int pageSize=1;//每页显示的条数
        int pageIndex=2;//第几页
        
        criteria.setMaxResults(pageSize);
        criteria.setFirstResult((pageIndex-1)*pageSize);
        
        
        
        
        List<Student> list = criteria.list();
        for (Student stu : list) {
            System.out.println(stu.getSid());
            System.out.println(stu.getSname());
        }
        //提交事务
        tx.commit();
        //关闭连接
        HibernateUtil.closeSession();
    }

 

查询结果如图

 

 

案例十二:使用DetachedCriteria查询超级无敌宇宙班的所有学生信息(DetachedCriteria)

//使用DetachedCriteria查询超级无敌宇宙班的所有学生信息
    public static void detachedCriteria(){
        //获取session
        Session session=HibernateUtil.currentSession();
        
        //构建一个DetachedCriteria对象
        DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Student.class);
        //取别名
        detachedCriteria.createAlias("grade", "g");
        //查询
        Criterion  criterion= Restrictions.eq("g.gname", "超级无敌宇宙班");
        //绑定
        detachedCriteria.add(criterion);
        
        //引入session
        List<Student> list = detachedCriteria.getExecutableCriteria(session).list();
        
        for (Student stu : list) {
            System.out.println(stu.getSid());
            System.out.println(stu.getSname());
        }
    }

 

结果如图

 

 

通过以上几种方式就差不多完成了Criteria查询的常用的知识点了!

 

posted @ 2016-08-22 17:06  巴黎的雨季  阅读(1993)  评论(0编辑  收藏  举报