• HIbernate查询


    一、Oid查询(根据oid主键查询)

        oid查询方式:

       1.get()方法:当调用get方法时,它会立即发出sql语句,并且返回的就是实际的对象,和普通查询没有区别,当查不到的时候返回null。

       2.load()方法:当调用load时,不是立马发送一个sql语句,而是返回目标对象的代理对象,在这个代理对象中只存储了目标对象的id值,只有调用id值以外的属性值时,才会发出SQL查询语句,当查询不到时,会报错。  

    二、对象导航查询

      HIbernate根据一个已经查到的对象,获得其关联对象的一种查询方式,

    三、HQL查询

      是Hibernate自带的

      类别:

      1.简单查询

         “from 表名"

        @Test
        public void test(){
            /*简单查询*/
            //查询不需要绑定到事务
            Session session = HibernateUtil.openSession();
            Query query = session.createQuery(" from com.ual.domain.user");
            List<user> list = query.list();
            System.out.println(list);
        }

       2.别名查询

      createQuery(select 别名 from 类名 别名)

      @Test
        public void test(){
        /*别名查询*/
            /*
            * HQL中不支持*的写法
            * createQuery(select 别名 from 类名 别名)
            * */
            Session session = HibernateUtil.openSession();
            Query query = session.createQuery(" select  c from user c");
            List<user> list = query.list();
            System.out.println(list);
        }

    3.排序查询

     createQuery("select c from 表名 c order by u_id desc")

        @Test
        public void test(){
       /*排序查询*/
            /*
            * createQuery("select c from 表名 c order by u_id desc")
            * desc 降序,asc升序*/
            Session session = HibernateUtil.openSession();
            Query query = session.createQuery(" select  c from user c order by u_id desc ");
            List<user> list = query.list();
            System.out.println(list);
        }

    4.条件查询

      4.1 位置绑定:根据参数的位置进行绑定(现在不用)

      4.2别名绑定:把参数对应的值起一个名称,再设定名称的值

      from 表名 where 属性名=:别名

     @Test
        public void test2(){
             /*条件查询*/
            Session session = HibernateUtil.openSession();
            Query query = session.createQuery("from user where u_name=:uname");//为参数起一个别名
            query.setParameter("uname","user1");//在别名中设置值
            List<user> list = query.list();
            System.out.println(list);
    
        }

    5.投影查询

      查询对象的某个或某些属性

      1.单个属性:

      2.多个属性:

      3.查询多个属性,封装到对象中(要在类中提供构造器)

      @Test
        public void test3(){
            //投影查询,查询单个属性
            Session session = HibernateUtil.openSession();
            List<Object> list = session.createQuery("select  c.u_name from  user c").list();//返回的集合中装的是Object对象
            System.out.println(list);
            System.out.println("----------------------------");
            //投影查询,查询多个属性
            List<Object[]> list1 = session.createQuery("select c.id,c.u_name from user c").list();//返回的集合中装的的Object数组
            for (Object[] objects : list1) {
                for(int i=0;i<objects.length;i++){
                    System.out.println(objects[i]);
                }
            }
            System.out.println("-------------------------");
            //投影查询,把查询到的结果封装成对象,需要在domain类中加入带参构造器,同时不要忘了加上其无参构造器
            List<user> list2 = session.createQuery("select new user(u_id,u_name) from user c").list();
            System.out.println(list2);
        }

    6.分页查询

      

        @Test
        public void test4(){
            //分页查询
            Session session = HibernateUtil.openSession();
            Query query = session.createQuery("from user");
            query.setFirstResult(0);//设置开始角标,角标是从0开始的
            query.setMaxResults(2);//查询多少条
            List<user> list = query.list();
            System.out.println(list);
    
        }

    7.统计查询

      1.查询的结果只有一个

        

     @Test
        public void test5(){
            /*查询所有的记录数*/
            Session session = HibernateUtil.openSession();
            Query query = session.createQuery("select  count(*) from user ");
            Object o = query.uniqueResult();//这里查出来的是单一的值,不用list,用uniqueResult
            System.out.println(o);
        }

    8.分组查询

        @Test
        public void test6(){
            /*分组查询*/
            Session session = HibernateUtil.openSession();
            Query query = session.createQuery("select u_name,count (*) from  user group by  u_name");
            List<Object[]> list = query.list();//因为查出来的是两个字段,所以是list中存的是Object 数组
            for (Object[] objects : list) {
                System.out.println(Arrays.toString(objects));
            }
        }

    9.多表查询

      普通连接:

        @Test
        public void test7(){
            /*连接查询*/
            Session session = HibernateUtil.openSession();
            List<Object[]> list = session.createQuery("from user c inner join c.roles").list();
            for (Object[] objects : list) {
                System.out.println(Arrays.toString(objects));
            }
        }

      迫切连接:

      @Test
        public void test8(){
            /*迫切连接,会自动封装成对象*/
            Session session = HibernateUtil.openSession();
            List<user> list = session.createQuery("from user c inner  join fetch  c.roles").list();//返回的是user对象,而不是数组
            for (user user : list) {
                System.out.println(user);
            }
    
        }

    四、QBC查询(Query By  Criteria)

      是一种更加面向对象化的查询方式,多用于条件查询。

      1.普通查询

      

         @Test
        public void test(){
                Session session = HibernateUtil.openSession();
                Criteria criteria = session.createCriteria(user.class);
                List<user> list = criteria.list();
                System.out.println(list);
    
            }

    2.可对查询结果添加排序

    //添加排序
    
    criteria.addOrder(Order.desc("u_id"));

    3.设置分页

        //设置分页
                criteria.setFirstResult(0);
                criteria.setMaxResults(2);

    4.条件查询

      = :eq

      >:gt

      >=:ge

      <:lt

      <=:le

      <>:ne

      like 

      in

      and

      or

    多条件就是多加几个add

         @Test
        public void test2(){
                Session session = HibernateUtil.openSession();
                Criteria criteria = session.createCriteria(user.class);
                criteria.add(Restrictions.eq("u_name","user1"));//添加查询条件,u_name="user1"
                List<user> list = criteria.list();
                System.out.println(list);
            }

    多条件查询

      

         @Test
        public void test2(){
                Session session = HibernateUtil.openSession();
                Criteria criteria = session.createCriteria(user.class);
              //  criteria.add(Restrictions.eq("u_name","user1"));//添加查询条件,u_name="user1"
                criteria.add(Restrictions.like("u_name","%1"));
                List<user> list = criteria.list();
                System.out.println(list);
            }

    5.统计查询(聚合函数)

      

            @Test
        public void test3(){
                Session session = HibernateUtil.openSession();
                Criteria criteria = session.createCriteria(user.class);
                criteria.setProjection(Projections.rowCount());//设置要查询的条件,即聚合函数
                //执行查询
                Object o = criteria.uniqueResult();
                System.out.println(o);
            }

    6.离线条件查询

        指脱离session,添加条件。可以在外部提前使用DetachedCriteria对象提前设置好条件,最后再绑定到session。

        条件可以在任意层写

           @Test
        public void test4(){
                /*离线条件查询*/
                DetachedCriteria detachedCriteria = DetachedCriteria.forClass(user.class);//获取离线条件对象
                //设置条件
                detachedCriteria.add(Restrictions.like("u_name","%2"));
                /*以上部分一般不写在dao层,由参数传入*/
                Session session = HibernateUtil.openSession();
                Criteria criteria = detachedCriteria.getExecutableCriteria(session);//获得criteria对象
                List<user> list = criteria.list();
                for (user user : list) {
                    System.out.println(user);
                }
    
            }

      

      

     

  • 相关阅读:
    快速排序——中位数
    DataGridView 在下拉框添加下来事件
    VS2015 调试时 编辑并继续不可用
    用soapUI测试webservice
    SQL Server 2008 表变量 临时表
    mvc 返回值
    asp.net 页面上的点击事件
    C# SQL 面试题自我总结
    cf contest 1458
    【CFR#655】F Omkar ans Modes
  • 原文地址:https://www.cnblogs.com/UalBlog/p/10607654.html
Copyright © 2020-2023  润新知