hibernate框架四

hibernate框架四

九.Criteria查询

  1. 什么是Criteria

    Hibernate提供的完全面向对像的查询方式,让不熟悉SQL及HQL语法的人也可以使用hibernateAPI操作数据库

  2. 使用HQL的步骤

    • 获取Session对像
    • 创建Criteria接口
    • 向Criteria接口中封装查询信息
    • 返回结果
  3. 查询方式

返回集合类型数据

public List<Student> selectAll(){
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Student> list = null;
        try {
            //返回Criteria接口对像
            Criteria ctr = session.createCriteria(Student.class);
            //使用该接口的list()方法
            list = ctr.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }

有条件的查询

public Student selectByItem(int id){
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        Student  stu = null;
        try {
            Criteria ctr = session.createCriteria(Student.class);
            //创建条件对像Criterion,用来封装查询条件
            Criterion con = Restrictions.eq("id", id);//Restrictions,其中静态方法用来标识条件类型
            //Criteria接口关联条件对像
            ctr.add(con);
            //返回单一结果
            stu = (Student) ctr.uniqueResult();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return stu;
    }

复合条件查询

public List<Student> selectByItem2(int id,String name){
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Student>  list = null;
        try {
            Criteria ctr = session.createCriteria(Student.class);
            //创建条件对像Criterion,用来封装查询条件
            Criterion con1 = Restrictions.eq("id", id);
            Criterion con2 = Restrictions.eq("name", name);
            Criterion con = Restrictions.or(con1, con2);
            //Criteria接口关联条件对像
            ctr.add(con);
            list = ctr.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }

排序

public List<Student> selectByOrder(){
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Student>  list = null;
        try {
            Criteria ctr = session.createCriteria(Student.class);
            //创建Order对像
            Order order = Order.desc("id");//按Student类的id属性进行排序
            //关联排序对像
            ctr.addOrder(order);
            list = ctr.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }

分页查询

public List<Student> selectByPage(int firstResult,int maxResults){  
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Student>  list = null;
        try {
            Criteria ctr = session.createCriteria(Student.class);
            //分页
            ctr.setFirstResult(firstResult);
            ctr.setMaxResults(maxResults);
            list = ctr.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }

显示内连接查询

注意:createCriteria()和createAlias()的区别

  • CreateAlias 返回值还是当前的Criteria对像,但是CreateCriteria返回的新的Criteria对像。
  • 每个CreateCriteria实体的条件必须紧跟CreateCriteria的实体其后。而CreateAlias创建表别名的方式,只要在这个表的别名创建之后都可以再进行条件的添加(条件必须包含别名)
public List<Student> selectByJoin1(){
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Student>  list = null;
        try {
            //内联接方式:clazz是Student类中POJO属性
            //Criteria ctr = session.createCriteria(Student.class).createCriteria("clazz");
            //Criteria ctr = session.createCriteria(Student.class).createAlias("clazz", "c");
            Criteria ctr = session.createCriteria(Student.class,"s").createCriteria("clazz", "c");
            list = ctr.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }   
//createCriteria()和createAlias()的区别示例
//第一种写法
var cri = session.CreateCrieria(Student.class)
       .Add(Restrictions.Eq("name", "jack") //该条件需紧贴着Student
       .CreateCrieria("clazz","c") 
       .Add(Restrictions.Eq("c.name","高三一班"); //该条件必须紧贴clazz之后
//第二种写法。
var cri = session.CreateCrieria(Student.class)
       .CreateAlias("clazz","c") 
       .Add(Restrictions.Eq("c.name","高三一班");
       .Add(Restrictions.Eq("name", "jack") //前后都没有关系,贴着role也可以。

外连接查询

public List<Student> selectByJoin2(){
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Student>  list = null;
        try {
            Criteria ctr = session.createCriteria(Student.class,"s");
            //clazz是Student类中POJO属性
            ctr.setFetchMode("clazz", FetchMode.JOIN);//设置外连接方式
            list = ctr.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }

example实例查询

public List<Student> selectByExample(){
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Student>  list = null;
        try {
            //创建Exmple实例
            Student stu = new Student();
            stu.setName("jack");
            stu.setAge(20);

            Criteria ctr = session.createCriteria(Student.class,"s");
            //注意:stu对像中属性为null的值将不作为查询条件
            ctr.add(Example.create(stu));
            list = ctr.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }

投影查询

使用Projection接口,和Projections类的projectList()来设置投影查询条件(分组,聚合函数…)

public List<Object> selectByProjection(){
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Object>  list = null;
        try {
            Criteria ctr = session.createCriteria(Student.class,"s");
            //封装投影属性
            //Property和Projection继承关系
            ctr.setProjection(Property.forName("name"));
            list = ctr.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }
public List<Object> selectByProjection2(){
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Object>  list = null;
        try {   
            Criteria ctr = session.createCriteria(Student.class,"s");
            //查询多个属性时,请使用Projections.projectionList(),向其中封装相应属性即可
            ctr.setProjection(Projections.projectionList().
                    add(Property.forName("name")).
                    add(Property.forName("age"))
                    );
            list = ctr.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }

分组查询

public List<Object[]> selectByGroup(){

        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Object[]>  list = null;
        try {
            Criteria ctr = session.createCriteria(Student.class,"s");
            //使用Projections.projectionList()进行分组
            ctr.setProjection(Projections.projectionList()
                    .add(Projections.groupProperty("sex"))
                    .add(Projections.rowCount())
                    .add(Projections.max("age"))
                    );
            list = ctr.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }

DetachedCriteria离线查询

注意:DetachedCriteria和Criteria的区别

  • Criteria由Session对像创建,而DetachedCriteria不需要使用Session
  • DetachedCriteria可以作为方法参数传递来构建查询条件
public List<Object[]> selectByDetached(){
        Session session = DBUtil.findSession();
        Transaction tx = session.beginTransaction();
        List<Object[]>  list = null;
        try {
            //创建DetachedCriteria对像
            DetachedCriteria dctr = DetachedCriteria.forClass(Student.class);
            //向DetachedCriteria封装查询信息
            dctr.setProjection(Projections.projectionList()
                    .add(Projections.groupProperty("sex"))
                    .add(Projections.rowCount())
                    .add(Projections.max("age"))
                    );

            //关联session,创建可执行的Criteria
            Criteria ct = dctr.getExecutableCriteria(session);
            list = ct.list();
            tx.commit();
        } catch (Exception e) {
            e.printStackTrace();
            tx.rollback();
        }
        return list;
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值