HQL实用技术
Hibernate支持的查询方式
-
HQL查询
-
Criteria查询
-
原生SQL(Native SQL)查询
什么是HQL
HQL是Hibernate查询语言(Hibernate Query Language)
from cn.hibernatedemo.entity.Dept
from Dept
from Dept where deptName = 'SALES'
from Dept dept where dept.location is not null
from Emp order by hireDate,salary desc
select deptNo,deptName from Dept
执行HQL语句
执行HQL语句的步骤
- 获取Session对象
- 编写HQL语句
- 创建Query对象
- 执行查询,得到查询结果
session = sessionFactory.getCurrentSession();
String hql = "from Emp";
Query query = session.createQuery(hql);
//list()方法
List<Emp> empList = query.list();
session = sessionFactory.getCurrentSession();
String hql = "from Emp";
Query query = session.createQuery(hql);
//iterate()方法
Iterator<Emp> empIterator = query.itertate();
在HQL查询语句中绑定参数
-
使用字符串拼接查询条件存在各种弊端
"from User where name = ’ " + name + " ’ "- 性能低
- 不安全
-
使用占位符
- 按参数位置绑定
- from User where name = ?
- 下标从 0 开始
- 按参数名称绑定
- from User where name = :name
- 可读性好,易维护,推荐使用
- 按参数位置绑定
为参数赋值
- setXXX():针对具体数据类型
- setXXX( int position, XXX value)
- setXXX( String name, XXX value)
- setParameter():任意类型参数
- setParameter( int position, Object valeu)
- setParameter( String name, Object value)
- setProperties():转为命名参数定制
动态HQL查询
Map<String,Object> map = new HashMap<>();
map.put("job","CLERK");
map.put("sal",1000);
map.put("startDate","1981-4-1");
map.put("endDate","1984-9-9");
public List<Emp> queryEmps(Map map){
String hql = "from Emp where 1=1";
StringBulider sb = new StringBulider(hql);
String job = map.get("job");
Integer sal = map.get("sal");
Date startDate = map.get("startDate");
Date endDate = map.get("endDate");
if(null != jog){sb.append("and job = :job");}
if(sal > 0){sb.append("and sal > :sal");}
if(null != startDate && null != endDate){
sb.append("and hireDate >= :startDate and hireDate <= :endDate");
}
hql = sb.toString();
Query query = session.createQuery(hql);
if(null != jog){query.setParameter("job",job);}
if(sal > 0){query.setParameter("sal",sal);}
if(null != startDate && null != endDate){
query.setParameter("startDate",startDate);
query.setParameter("endDate",endDate);
}
return query.list();
}
分页查询
-
Query接口的相关方法
-
uniqueResult():获取唯一对象
-
setFirstResult():设置从第几条开始
-
setMaxResults():设置读取最大记录数
String hql = "from User"; List<User> users = session.createQuery(hql).setFirstResult(5).setMaxResults(5).list();
-
投影
- HQL投影查询是查询一个持久化类的一个或多个属性值,或者是通过表达式或聚合函数得到的值
- 投影查询需要使用HQL的select子句
- 查询结果的封装主要分三种情况
- 封装成Object对象
- 封装成Object数组
- 通过构造方法封装成对象
- 对象不是持久化状态,仅用于封装结果
若查询结果仅用于展示,不需要保持持久化状态,应尽量使用投影查询以减少开销,提高效率