本帖最后由 大蓝鲸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关键字,进行结果过滤
|