十五、Hibernate查询语言

来源:互联网 发布:淘宝实体店 编辑:程序博客网 时间:2024/05/17 06:54

一、了解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());

}