A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 大蓝鲸Java 于 2017-12-1 12:41 编辑

【南京校区】hibernate之HQL详解

学习HQL我们可以从以下几个方面去理解
1、HQL是什么?
     (1) HQL是Hibernate Query Language的缩写。
     (2) HQL提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。
     (3) Hibernate将HQL查询方式立为官方推荐的标准查询方式。

2、HQL的语法格式是什么?
      完整的HQL语句形式如下:
      Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc
      其中的update/delete为Hibernate3中所新添加的功能
      例1:查询所有
      
[Java] 纯文本查看 复制代码
Query query = session.createQuery("from Customer"); //注意:Customer是实体的类名,要注意区分大小写
List<Customer> list = query.list();

      例2:分页查询
      
[Java] 纯文本查看 复制代码
Query query = session.createQuery("from Customer");
query.setFirstResult(10);    // 数据库中记录的开始位置,从0开始     公式:(当前页数-1)*每页显示的条数
query.setMaxResults(10);  // 本次查询结果回显的条数
List<Customer> list = query.list();

      例3:查询指定列
      
[Java] 纯文本查看 复制代码
String hql = "select name,address from Customer";
Query query = session.createQuery(hql); 
List<Object[]> list = query.list(); //注意:返回的结果是Object数组,数组中封装的是对应列的值
如果希望返回具体对象该如何处理?答:可以采用投影查询,步骤如下
步骤一:在Customer类中生成以name,address为参数的构造,注意,无参数构造也要有。
步骤二:HQL写法:String hql = "Select new Customer(name,address) from Customer";

      例4:条件查询
      
[Java] 纯文本查看 复制代码
(1) 无名称参数
Query query = session.createQuery("from Customer where name=?");
query.setParameter(0, "姓名0");
(2) 有名称参数
Query query = session.createQuery("from Customer where name=:myname"); 
query.setParameter("myname", "姓名0");
注意事项:在jdbc中,setParameter的下标是从1开始的,而hibernate的setParameter的下标是从0开始的。

      例5:唯一结果查询
      
[Java] 纯文本查看 复制代码
Query query = session.createQuery("from Customer where id=?");
query.setParameter(0, 1);
// 如果能保证结果就是唯一的,那么可以使用
Customer c = (Customer) query.uniqueResult();

3、HQL怎么实现多表联合查询?
      例1:内连接
      
[Java] 纯文本查看 复制代码
      //无条件
      String hql = "from Customer c inner join c.orders";
      Query query = session.createQuery(hql);
      List<Object[]> list = query.list();

      //有条件
      String hql = "from Customer c inner join c.orders with c.id=1";
      Query query = session.createQuery(hql);
      List<Object[]> list = query.list();

       注意事项:返回的是Object数组,数组中封装的是Customer与Order对象
       例2:外连接
      
[Java] 纯文本查看 复制代码
String hql = "from Customer c left outer join c.orders";
Query query =session.createQuery(hql).list(); 
List<Object[]> list = query.list();

       注意事项:返回的是Object数组,数组中封装的是Customer与Order对象
       例3:迫切连接
      
[Java] 纯文本查看 复制代码
String hql = "select distinct c from Customer c inner join fetch c.orders";
Query query = session.createQuery(hql);
List<Customer> list = query.list();

       注意事项:
       (1) 迫切连接返回的是From后面的类的对象
       (2) 迫切连接不可以使用with关键字,进行结果过滤
       (3) 使用where关键字,进行结果过滤



3 个回复

倒序浏览
6666666666666
回复 使用道具 举报
亮瞎双眼,继续崇拜
回复 使用道具 举报
大神,献上我的膝盖!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马