一、了解HQL语言
HQL语言是面向对象的查询语言,区分大小写,它查询的是实体对象
HQL基本语法:
select "对象。属性名"
from "对象"
where "过滤条件"
group by "对象。属性名" having "分组条件"
order by "对象。属性名"
eg: select * from Employee emp where emp.flag='1'
等价于 from Employee emp where emp.flag='1'
二、实体对象查询
在HQL语句中,可以通过from子句对实例对象进行直接查询,
from Person
也可以给对象取别名
from Person per
上面的HQL语句将查询数据库中实体对象Person所对应的所有数据,并以封装好的Person对象的集合的形式返回。
select new Person(id.name) from Person per
此种查询方式通过“new”关键字对实体对象动态实例化,将指定的实体对象重新封装,既不失去数据的封装,又可以提高查询效率。
上面的语句中,最好不要使用以下语句进行查询
select per.id,per.name from Person per
因为此语句返回的并不是原来的对象实体状态,而是一个object类型的数组,它破坏了数据原有的封装性。
三、条件查询
from Employee emp where emp.sex="男"
四、HQL参数绑定机制
String hql = "from Employee emp where emp.sex=?";
Query q = session.createQuery(hql);
q.setParameter(0,"男");
empList = q.list();
也可以
String hql = "from Employee emp where emp.sex=:sex";
Query q = session.createQuery(hql);
q.setParameter("sex","男");
empList = q.list();
五、排序查询
from Employee emp order by emp.age desc ->降序
from Employee emp order by emp.id asc-->升序
六、聚合函数的应用
HQL查询语言支持SQL中常用的聚合函数,如sum、avg、count、max、min等
select avg(emp.age) from Employee emp
select min(emp.age) from Employee emp
七、分组方法
在HQL中,可以在group by 子句中使用having语句,但是前提是需要底层数据库的支持,MySQL数据库就不支持
String hql = "select emp.sex,count(*) from Employee emp group by emp.sex";
List emplist = q.list();
Iterator it = empList.iterator();
while(it.hasNext()){
Object[] results = (Object)it.next();
System.out.print("员工性别:"+results[0]+"-------");
System.out.print("人数:"+results[1]+"-------");
}
注意:
(1)HQL分组查询语句:分组的条件参数(也就是group by子句后面的参数)必须在查询的结果集中。
(2)遍历对象数组,由于分组查询破坏了实体对象原来的状态,所以结果集返回的是对象数组。
group by子句与order by子句都不能含有算术表达式,同时分组的条件不能是实体对象本身,eg group by Employee是不正确的,除非实体对象的所有属性都是非聚集的。
八、聚合查询
在SQL中熟知的连接查询方式---内连接(inner join)、左连接查询(left outer join)、右连接查询(right outer join)和全连接查询(full join),HQL查询语句中也支持联合查询的这种方式
Session session =null;
List<Object[] list> list = new ArrayList<Object[]>();
try{
session = HibernateInitaialize.getsession();
session.begingTransaction();
String hql = "select peo.id,peo.name,peo.age,peo.sex,c.idcard_code from People peo left join peo.incard c";
Query q = session.createQuery(hql);
list = q.list();
session.getTransaction().commit();
}
request.setAttribute("list", list);
RequestDispatcher rd = this.getServletContext().getRequestDispatcher(
"/index.jsp");
rd.forward(request, response);
<table>
<tr>
<th width="30px">编号</th>
<th width="30px">姓名</th>
<th width="30px" align="center">性别</th>
<th width="30px">年龄</th>
<th width="135px">身份证号</th>
</tr>
<c:forEach items="${list}" var="list">
<tr>
<td align="center">${list[0]}</td>
<td>${list[1]}</td>
<td>${list[2]}</td>
<td>${list[3]}</td>
<td>${list[4]}</td>
</tr>
</c:forEach>
</table>
九、子查询
from Employee emp wher emp.age>(select avg(age) from Employee);
Query q = session.createQuery(hql);
List<employee> list = q.list();
for(Employee emp:list){
System.out.println("ID值最小的员工为:"+emp.getName());
System.out.println("其ID值为:"+emp.getId());
}