zoukankan      html  css  js  c++  java
  • Hibernate检索方式和Criteria查询的讲解

     Hibernate框架5种检索方式

         1.导航对象图检索方式:根据已经加载的对象导航到其他对象

         2.OID检索方式:按照对象的OID来检索对象

         3.HQL检索方式:使用面向对象的HQL查询语言

         4.QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口

         5.本地SQL检索方式:使用本地数据库的SQL查询语句 这次重点讲解Criteria查询,首先我们先了解一下它。  Criteria 查询采用面向对象方式封装查询条件,又称为对象查询,对SQL语句进行封装
      采用对象的方式来组合各种查询条件,由Hibernate 自动产生SQL 查询语句Criteria由Hibernate Session进行创建。
       0. HibernateUtil辅助类的代码如下

    package entity;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
    private static final ThreadLocal sessionTL=new ThreadLocal();
    private static Configuration conf;
    private final static SessionFactory sf;
    static{
        try {
            conf=new Configuration().configure();
            sf=conf.buildSessionFactory();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new ExceptionInInitializerError(ex);
        }
        
    }
    public static Session currentSession(){
        Session session=(Session)sessionTL.get();
        if (session==null) {
            session=sf.openSession();
            sessionTL.set(session);
        }
        return session;
        
        
    }
    public static void closeSession(){
        Session session=(Session)sessionTL.get();
        sessionTL.set(null);
        session.close();
        
    }
    }

    1.无条件查询

        /*
         * 无条件查询
         */
    @Test
    public void criTest(){
        Session session = HibernateUtil.currentSession();
        Transaction tx = session.beginTransaction();
        Criteria criteria = session.createCriteria(Dept.class);
        List<Dept> list=criteria.list();
        for (Dept dept : list) {
            System.out.println(dept.getDeptName());
        }
        tx.commit();
         HibernateUtil.closeSession();
        
    }

    2.比较运算

    /*
         * 比较运算
         * 条件查询
         */
        @Test
    public void criTestByname(){
        Session session = HibernateUtil.currentSession();
        Transaction tx = session.beginTransaction();
        List<Dept> list = session.createCriteria(Dept.class).add(Restrictions.eq("deptName", "测试部")).list();
        for (Dept dept : list) {
            System.out.println(dept.getDeptName());
        }
        tx.commit();
         HibernateUtil.closeSession();
        
    }
       

    3.别名查询

    /*
         * 别名查询
         */
        @Test
        public void criNamedTest(){
            Session session = HibernateUtil.currentSession();
            Transaction tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Emp.class);
            criteria.createAlias("dept", "d");//把emp中dept属性命名为d
            List<Emp> list=criteria.add(Restrictions.eq("d.deptName", "测试部")).list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }
            tx.commit();
             HibernateUtil.closeSession();
            
        }

    4.范围运算

    /*
         * 范围运算
         * Restrictions.in查询
         */
        @Test
        public void criInTest(){
            Session session = HibernateUtil.currentSession();
            Transaction tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Emp.class);
            List<String> loclist=new ArrayList<>();
            loclist.add("bj");
            List<Emp> list=criteria.add(Restrictions.in("loc", loclist)).list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }
            tx.commit();
             HibernateUtil.closeSession();
            
        }

    5.模糊查询

    /*
         * 字符串模式匹配(模糊查询)
         */
        @Test
        public void criLikeTest(){
            Session session = HibernateUtil.currentSession();
            Transaction tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Emp.class);
        List<Emp> list=    criteria.add(Restrictions.like("loc", "%b%")).list();
        //下面和上面实现功能一样,只不过忽略大小写
        //List<Emp> list=    criteria.add(Restrictions.ilike("loc", "b",MatchMode.ANYWHERE)).list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }
            tx.commit();
             HibernateUtil.closeSession();
            
        }

    6.逻辑运算

    /*
         * 逻辑运算 and or not
         */
        @Test
        public void criAndTest(){
            Session session = HibernateUtil.currentSession();
            Transaction tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Emp.class).add(Restrictions.and(Restrictions.eq("empName", "小乐"),Restrictions.like("loc", "%b%")));    
            List<Emp> list = criteria.list();    
            for (Emp emp : list) {
                System.out.println(emp.getEmpNo());
            }
            tx.commit();
             HibernateUtil.closeSession();
        }

    7.动态查询

    /*
         * 动态查询
         */
        @Test
        public void cridynamicTest(){
            Session session = HibernateUtil.currentSession();
            Transaction tx = session.beginTransaction();
            Emp empcri=new Emp();
            empcri.setEmpName("小乐");
            empcri.setEmpNo(0);
            Criteria criteria = session.createCriteria(Emp.class);    
            if (empcri.getEmpName()!=null) {
                //用户填写姓名作为条件
                criteria.add(Restrictions.eq("empName", empcri.getEmpName()));
            }
            if (empcri.getLoc()!=null) {
                criteria.add(Restrictions.gt("empNo", empcri.getEmpNo()));
            }
            List<Emp> list = criteria.list();    
            for (Emp emp : list) {
                System.out.println(emp.getEmpNo());
            }
            tx.commit();
             HibernateUtil.closeSession();
        }

    8.排序

    /*
         * 排序
         */
        @Test
        public void criOrderTest(){
            Session session = HibernateUtil.currentSession();
            Transaction tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Emp.class);    
            List<Emp> list = criteria.addOrder(Order.asc("empNo")).list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }
            tx.commit();
             HibernateUtil.closeSession();
        }

    9.分页

    /*
         * 分页
         */
        @Test
        public void  criPageTest(){
            Session session = HibernateUtil.currentSession();
            Transaction tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Emp.class);    
            int pageIndex=2;//当前页码
            int pageSize=2;//每页显示数据量
            criteria.setFirstResult((pageIndex-1)*pageSize);
            criteria.setMaxResults(pageSize);
            List<Emp> list =criteria.list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }
            tx.commit();
             HibernateUtil.closeSession();
            
        }

    10.detachedCriteria查询

    /*
         * detachedCriteria查询
         */
        @Test
        public void detachedCriTest(){
            Session session = HibernateUtil.currentSession();
            DetachedCriteria dc=DetachedCriteria.forClass(Emp.class,"e");
            dc.createAlias("e.dept", "d").add(Restrictions.eq("d.deptName", "测试部"));
        List<Emp> list=dc.getExecutableCriteria(session).list();
            for (Emp emp : list) {
                System.out.println(emp.getEmpName());
            }
             HibernateUtil.closeSession();
             
        }
  • 相关阅读:
    模型命名规范
    Jquery 将表单序列化为Json对象
    Failed to read auto-increment value from storage engine错误的处理方法
    css样式表中设置table的第一列的宽度是固定值
    thinkphp中I("parm")用法的注意事项
    获取凌晨00:00:00的时间
    php empty()和isset()的区别
    react续集
    react的笔记整理
    vuex
  • 原文地址:https://www.cnblogs.com/wth1129/p/5796287.html
Copyright © 2011-2022 走看看