在Hibernate中支持三种查询方式:HQL查询、Criteria查询以及SQL查询,HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念。HQL的功能非常强大,能满足实际开发中的各种查询要求。
在编写HQL语句时HQL语句是不区分大小写的。
1.from子句
Hibernate中最简单的HQL语句形式如下:
指定了类的全限定路径
from cn.hibernatemo.entity.Dept
也可以为类起便命
from Dept as dept
2.select子句
select子句用于选取对象和属性
select dept.deptName from Dept as dept
选择了Dept类的属性deptName。
3.where子句
where子句用于表达查询的限制条件
from Dept where deptName=‘指定的名称’
属性为null或者非空则需要 is not null或is null
4.使用表达式
表达式一般用在where子句中即函数表达式例如:lower()、year()等hibernate支持的表达式。
5.order by 子句
order by 子句用于按指定属性排序
语法如下:
from Emp order by 属性1,属性2 desc
执行HQL语句
HQL编写号之后,我们需要session来创建一个Query对象,语句如下:
String hql=“from User”;//定义HQL语句
Query query =session.createQuery(hql);//构建query对象
List userList=query.list();//执行查询
一般我们使用foreach循环遍历出结果,或者使用迭代器iterator,语句如下:
public static void main(String[] args) {
//更新
Transaction tx=null;
Session session=null;
try {
session=HibernateUtil.getCurrectionSession();
tx=session.beginTransaction();
/* User user=(User) session.load(User.class,1122);//更新时根据id查询是否有此用户
//load方法是延迟加载不管是否有此对象id会赋给该对象。
user.setEmpName(“肥熊3219”);
tx.commit();//使用脏检查来实现更新数据*/
//使用HQL现实查询多条记录以及多条件查询
String hql=“from User”;
/* List userList= session.createQuery(hql).list();
//使用foreach
for (User user: userList) {
System.out.println(“编号:”+user.getEmpNo()+"\t"+“姓名:”+user.getEmpName());
}*/
Iterator userList=session.createQuery(hql).iterate();
//使用iterator遍历
User user=null;
while(userList.hasNext()){
user=userList.next();
System.out.println(“使用iterator遍历”+user.getEmpName());
}
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
if (tx!=null){
tx.rollback();
}
}
}
如何在HQL语句中绑定参数
参数绑定的形式:
1.按参数位置绑定
在HQL语句中用"?"占位符定义参数的位置。
示例如下:
String hql="from User where empName=?";
Iterator<User> userList=session.createQuery(hql).setString(0,"TURNER").iterate();
2.按参数名称绑定
例如:
String hql1="from User where empName= :ename";
Iterator<User>
userList=session.createQuery(hql1).setString("ename","TURNER").iterate();
其中按参数名来绑定比按位置(下标)绑定参数的可读性较好。
除了这两种方式还有setParameter(index,Object)方法、setProperties(Object obj)这种方式是将HQL语句中的参数与它的属性绑定。
HQL除了能使用list()、iterate()方法获取查询结果集,也可以使用uniqueResult()方法获取唯一结果,一般用于查询总记录数时使用,如果查询结果不唯一使用了这个方法会报错。
**如何使用HQL语句实现分页**
示例如下:
/**
* 使用HQL语句实现分页查询的功能
*/
public static List<User> Test_Page(Integer pageNo,Integer pageSize){
session=HibernateUtil.getCurrectionSession();
transaction=session.beginTransaction();
String hql="from User order by empNo";
return session.createQuery(hql).setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize).list();
}
**使用投影查询**
有时候我们不需要获取对象的全部属性,而只需要获取对象的一个或几个属性,或者需要通过表达式、聚合函数等方式得到某些结果,此时可以使用投影查询。投影查询需要使用HQL的select子句,对于投影结果的方式有以下三种常见情况。
1.每条查询结果仅包含一个结果列。
/**
* 使用投影查询结果
*/
public static List<String> Test_Use(){
session=HibernateUtil.getCurrectionSession();
transaction=session.beginTransaction();
String hql="select empName from User";
return session.createQuery(hql).list();
}
2.如果查询的不只是一个结果列,我们就要把上面那个方法的返回类型修改为List<Object[]>
3.将每条查询结果通过构造方法封装成对象。
就是以对象的方式使用查询结果,示例如下:
/**
* 使用投影查询结果--将每条查询结果通过构造方法
*/
public static List<User> Test_use_construct(){
session=HibernateUtil.getCurrectionSession();
transaction=session.beginTransaction();
String hql="select new User(empNo,empName) from User";
return session.createQuery(hql).list();
}
其中,我们在创建一个SSH框架时,这些实体类和映射文件都是自己手动创建的,但是在eclipse中有一个反向工具,它会根据数据表生成持久化类(实体类)和映射文件的工具,该工具成为Hibernate反向工具。具体的操作,下次再说明。