你的位置:首页 > ASP.net教程

[ASP.net教程]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查询的常用的知识点了!