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

时间: 2024-11-29 18:41:52

Hibernate框架中Criteria语句的相关文章

详解Java的MyBatis框架中SQL语句映射部分的编写

这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下 1.resultMap SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: ? 1 2 3 4 5 6 <mappers>   <mapper resource="com/limi

Hibernate框架之Criteria 详解

自从学数据库以来,从SQL查询-HQL查询-到Criteria 查询.有人问我:掌握一种查询语句不就可以吗,为什么还要学Criteria 查询?我回答道:用到特定于数据库的SQL 语句,程序本身会依赖于特定的数据库,不了解SQL 语句,恐怕对使用HQL带来困难.Hibernate提供的Criteria查询帮助我们解决了这种问题. 下面介绍一下Criteria查询. 1.Criteria 查询采用面向对象方式封装查询条件,又称为对象查询 2.对SQL 语句进行封装 3.采用对象的方式来组合各种查询

Hibernate框架中的HibernateUtil

对于刚学习三层框架的人来说,每一个配置文件和每一个类,以及功能来说都很新鲜,时常就忘记了相关类的功能. 在这里建议编程就是要多加练习,才能熟能生巧. 这里说一下HibernateUtil类,在使用Hibernate的前提是需要去下载Hibernate项目,然后在lib文件夹下面把所有的. jar 包 COPY到你项目的lib文件夹下. 什么是HibernateUtil类,或者是说有什么功能? Hibernate框架,主要解决的就是项目于数据库连接相关的问题,然而主要实现是需要靠配置文件中的代码与

在hibernate框架中配置显示sql语句

使用Hibernate的框架开发时,可在Hibernate.cfg.xml中加上 <property name="hibernate.show_sql">true</property><!-- 配置显示sql语句 -->  <property name="format_sql">true</property><!-- 让输出的sql语句格式化 --> 就可以在控制台显示对应的sql语句了,对于开

Hibernate框架中的HQL注入漏洞

 Hibernate是一种ORMapping框架,内部可以使用原生SQL还有HQL语言进行SQL操作. 所谓的HQL注入,就是指在Hibernate中没有对数据进行有效的验证导致恶意数据进入应用程序中造成的. 请看这段代码: Input参数即可造成注入. 不过在Hibernate中,一般都是在createQuery中使用PDO,使用setString填充占位符进行sql语句的拼接,如果是这样的话,自然就不存在SQL注入,但是不排除有人像上面的图片中的写法. 正常情况下: Sqlin参数存在注

Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询

在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以及MyBatis的分页问题. 首先先看看项目的架构,方便后边叙述. 这个项目中是一个Sping+MyBatis的完整demo(这边将页面没有展示.)这次的主题主要是后台数据处理逻辑.接下来为大家逐一介绍各个文件, org.config   Spring配置包括数据库的链接信息 org.control

在Hibernate框架中详谈一级缓存

在学习Hibernate的过程中我们肯定会碰上一个名词---缓存,一直都听说缓存机制是Hibernate中的一个难点,它分为好几种,有一级缓存,二级缓存和查询缓存 今天呢,我就跟大家分享分享我所理解的一级缓存 要想完美的体现出缓存机制的话,我想通过查询语句生成的sql应该就能够很清楚的看到 那些Hibernate的配置信息我就不展示了,直接看关键代码 场景:我要查询同一个对象,查询两次,观察在不同的情况下,sql语句的生成情况 我事先准备了一个HibernateUtil工具类,具体如下 pack

Hibernate框架中,使用JDBC语法

/** * 调用存储过程 * * @param PRONAME * @return */ public CallableStatement citePro(final String PRONAME){ Session session = getCurrentSession(); CallableStatement pro = session.doReturningWork(new ReturningWork<CallableStatement>() { @Override public Cal

Hibernate框架(二)POJO对象的操作

POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对POJO对象的简单增删改查的操作. 一,Hibernate框架中主键的生成策略有三种方式: 1,数据库负责生成主键(代理主键) a,native:表示由设置的方言决定采用什么数据库生成主键方式,例如:在MySQL中会采用自增长的方式,主键字段必须都是整形类型:在Oracle数据库中,会采用序列的增长方式. b,sequence:表示采用数据库的序列生成主键,适用于Oracle,DB2数据库中. c