您的位置:首页 > 其它

精通Hibernate——HQL查询详解

2015-09-02 15:50 337 查看
HQL(Hibernate query Language)是面向对象的查询语言,他具有以下功能:

1.在查询语句中设定各种查询条件

2.支持投影查询,即仅检索出对象的部分属性

3.支持分页查询

4.支持连接查询

5.支持分组查询,允许使用having和group by关键字

6.提供内聚函数,如sum、min和max

7.能够调用用户自定义的sql函数

8.支持子查询,即嵌入式查询

9.支持动态绑定参数

Session类的find方法以及query接口都支持HQL区别在于:

find:只是执行一些简单的HQL,不具有动态绑定参数的功能

query:真正的hql查询接口,支持以上提供的各种功能

例如检索姓名为Tom,并且年龄为21的Customer对象:

//创建一个query对象
Query query = session.createQuery("from Customer as c where c.name=:customerName and c.age=:customerAge");
//动态绑定参数
query.setString("customerName","Tome");
query.setInteger("age",21);
//执行查询语句,返回结果
List result = query.list();


Query接口支持方法链编程风格,他的setString方法以及其他setXXX()方法都返回自身实例,而不是返回void,下面看看setString源码:

public Query setString(int position,String val){
    setParameter(position,val,Hibernate.STRING);
    return this;
}


如果采用编程链风格

List result = session.createQuery("from Customer as c where c.name=:customerName and c.age=:customerAge").setString("customerName","Tome")
.setInteger("age",21).list();


多态查询

session.createQuery("from Employee");


假如Employee有两个子类,HourEmployee和SalariedEmployee,那么这个查询会查询出所有Employee类的实例,以及HourEmployee和SalariedEmployee实例,如果只想查询某个特定子类的实例:

session.createQuery(“from HourEmployee”);

分页查询

setFirstResult(int firstResult);设定从哪一个对象开始检索

setMaxResult(int maxResults);设定一次最多检出的对象数目

Query query = session.createQuery("from Customer c order by c.name asc");
query.setFirstResult(1);
query.setMaxResult(10);
List result = query.list();


检索单个对象

list():返回一个List类型的查询结果,在List集合中存放了所有满足查询条件的持久化对象

uniqueResult():返回单个对象

Customer customer = (Customer)session.createQuery("from Customer c order by c.name asc").setMaxResult(1).uniqueResult();


在HQL查询语句中绑定参数

1.按照参数名字绑定

Query query = session.createQuery("from Customer as c where c.name=:customerName and c.age=:customerAge");
query.setString("customerName",name);
query.setInteger("customerAge",age);


2.按照参数位置绑定

Query query = session.createQuery("from Customer as c where c.name=? and c.age=?");
query.setString(0,name);
query.setInteger(1,age);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: