Hibernate 中使用HQL进行查询

         1) 说明

              1> HQL: hibernate query language

              2> 特点

                  1. 与sql类似,sql中的语法基本上都可以直接使用

                  2. sql查询的是表和表中的列,HQL查询的是对象与对象中的属性

                  3. HQL的关键字不区分大小写,但是因为查询的是类与类中属性,所以必须区分大小写

                  4 select可以省略

         2) 简单查询

                说明:

                1> 查询的是对象中的所有属性

                2> select可以省略不写

                3> 必须有默认构造函数

           factory = new Configuration().configure().buildSessionFactory();
           session = factory.openSession();
           Transaction tx = session.beginTransaction();

           String hql = "FROM User";
           List<User> list = session.createQuery(hql).list();
           for(User u:list)
           {
               System.out.println(u);
           }
           tx.commit();
          3)带上过滤条件的查询

                说明:推荐使用别名,因为这样可以排除列名和关键字重名的情况(如select * from  User u where u.desc=0)

          hql = "FROM User u where u.id>5";
          List<User> list = session.createQuery(hql).list();
          4) 使用order by进行排序

          hql = "FROM User u ORDER BY u.name ,u.id DESC";
          List<User> list = session.createQuery(hql).list();
               说明:先使用name降序排序,如果name相同,那么再使用id降序排列
           5) 只选择部分属性

                 1> 只选择一个属性

          hql = "SELECT u.name FROM User u";
          List<String> names = session.createQuery(hql).list();
                   此处的list()的返回值是一个List,其中元素类型就是该对象属性的类型
                 2> 选择多个属性

          hql = "SELECT new User(u.id,u.name) FROM User u ";
          List<User> list = session.createQuery(hql).list();
                    注意:使用new的时候必须有对应的构造函数,否则会抛异常
            6) 分页查询

          hql = "FROM User";
          Query query = session.createQuery(hql);
          query.setFirstResult(0);
          query.setMaxResults(7);
          List<User> list = query.list();
                  firstResult指定的第一个结果的前一个下标,maxResult指定这一页查询多少个(如本例中查询1-7条记录,包含第七条)

             7) 聚集函数

          hql = "SELECT COUNT(*)FROM User";
          Number count = (Number) session.createQuery(hql).uniqueResult();

          hql = "SELECT MAX(id) FROM User";
          Number count = (Number) session.createQuery(hql).uniqueResult();

          hql = "SELECT MIN(id) FROM User";
          Number count = (Number) session.createQuery(hql).uniqueResult();

                  count()返回的是Long类型,但是max()、min()是根据字段类型来确定的,所以为了统一使用Number
            8)指定hql中参数

                  1>使用?,并使用下标来指定参数值

           hql = "SELECT u  FROM User u WHERE u.id =?";
           List list  =  session.createQuery(hql).setParameter(0, 3)//
                         .list();
                  2>使用变量名来指定参数值

           hql = "SELECT u  FROM User u WHERE u.id =:id";
           List list  =  session.createQuery(hql)//
                          .setParameter("id", 3)//
                          .list();
                 3>使用IN的时候设置参数

          hql = "SELECT u  FROM User u WHERE u.id in(:id)";
          List list  =  session.createQuery(hql)//
                         .setParameterList("id", new Object[]{1,2,3})//
                          .list();
              9)使用命名查询

                   也就是将hql语句放在配置文件中,通过名称来调用,这样可以解耦(一般对哪个类进行查询,hql就写在那个类的映射文件中)

                   映射文件中:

          <query name="queryById">
            <![CDATA[
                 FROM User u where u.id>=:idMin AND u.id<=:idMax
             ]]>
          </query>
                  因为hql中可能会有<,>这种在xml中有特殊含义的 字符,所以必须使用<![CDATA[ ]]>将hql包含进来,表示里面没有特殊字符,全部当成字符串好了
          List list  =  session.getNamedQuery("queryById")//
                               .setParameter("idMin", 3)//
                               .setParameter("idMax", 5)//
                               .list();
           10) 使用hql执行更新操作

          hql = "UPDATE User u SET u.name=:newName WHERE u.id=5";
          session.createQuery(hql)//
                  .setParameter("newName", "moonlight")//
                  .executeUpdate();
                   说明:使用hql执行更新,session中对象的状态并不会立即更新,如果需要获得最新的状态,需要使用refresh(),来再进行一次查询

           11) 使用hql执行删除操作

          hql = "DELETE FROM User u WHERE u.id=5";
         session.createQuery(hql)//
                .executeUpdate();
               说明:使用hql执行删除,session中对象的状态并不会立即更新,如果需要获得最新的状态,需要使用refresh(),来再进行一次查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值