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查询的常用的知识点了!