• HQL:Hibernate查询语言,它是Hibernate提供的一种面向对象的查询语言。
(1)在查询语句中设定各种查询条件
(2)支持动态绑定参数
(3)支持投影查询、分页查询、连接查询、分组查询,子查询
(4) 内置了一些聚集函数
二.HQL
Hibernate中的Query接口就是专门用来执行HQL语句的查询接口。
1.创建查询对象
Query query=session.createQuery(“fromDept”);
2.执行查询列出结果
1)列出所有的结果
List<Dept> depts=query.list();
for(Dept dept:depts){…}
• 2)列出单个结果
Query query=session.createQuery(“from Deptwhere id=1”);
query.setMaxResults(1);
Dept dept=(Dept)query.uniqueResult();
3)迭代访问结果
Iterator<Dept> it=query.iterate();
While(it.hasnext()){
}
HQL 基本语法:持久化类名区分大小写
1)选择要查询的持久化类。
String hql=“from Dept”
Query query=session.createQuery(hql);
String hql=“from Dept as d”;
2)投影查询
String hql="select id,name fromDept";
Query query=session.createQuery(hql);
List list=query.list();
intsize=list==null?0:list.size();
for(inti=0;i<size;i++){
Object[] obj=(Object[])list.get(i);
System.out.println(obj[1]+“ ”+obj[2]);
}
• 针对选定属性创建一个类,提供以这两个属性为参数的构造方法,使用此类来封装查询结果。
3)where 条件子句
• String hqlString="from Dept d whered.createdTime>='2010-01-01'";
• Query query=session.createQuery(hqlString);
• String hqlString="from Dept d where d.name like'java%' andd.employees is not empty and d.createdTime<current_date()";
• 绑定查询参数:
• 按参数名字绑定
• String hql=“from Dept whereid>:id and name like:likeName”
• List<Dept> depts=session.createQuery(hql).setLong(“id”,newLong(ingputID)).setString(“likeName”,”%”+inputName+”%”).list();
• 按参数位置绑定
• 5)distinct 过滤重复值
• Select distinct createTime from Dept
• 6)聚集函数
• select count(d) from Dept d
• 7)order by 排序
• From Dept d order by d.createdTime asc,d.name desc
• 8)group by 对记录分组
• Select count(e) from Employee e group by e.dept;
• 9)having 对分组后数据进行条件过滤
• Select e.dept.name from Eployee e group by e.dept havingcount(e)>1
分页查询
Query接口提供两个用于分批显示查询结果的方法
setFirstResult(intfirstResult):在记录集中从第几条记录开始取数据。默认是0。
setMaxResults(intmaxResults):设置每次查询返回的最大对象数。
session.beginTransaction();
String hql ="from Employee";
List<Employee>empls = session.createQuery(hql)
.setMaxResults(pageSize)
.setFirstResult((pageNo - 1)* pageSize)
.list();
session.getTransaction().commit();
批量修改和删除:直接通过SQL语句操作数据库,执行完后,当前session缓存中的数据与数据库中的数据不是同步的。
Stringhql=“delete Dept as d where d.name like:likeName”;
Queryquery=session.createQuery(hql).setString(“likeName”,”%三%”);
int count=query.executeUpdate();
连接查询
• Inner join left outer join
• Right outer join fulljoin
String hql ="FROM Dept d JOIN d.employees e "
+ " WHERE d.name LIKE :likeName";
抓取连接查询 fetch
抓取:是指从数据库加载一个对象数据时,同时把它所关联的对象和集合的数据一起加载出来,以便减少SQL语句的数据,从而提高查询效率。
From Dept d leftjoin Fetch d.employees e where d.name like “%web%”
子查询
From Dept dwhere (Select count(e) from d.employees e)>1
• 命名查询:是指将SQL查询语句编写在映射文件里,在程序中通过Session的getNameQuery()方法来获取该查询语句。
<queryname="findDeptsByCondition">
<![CDATA [from Dept d where d.name like:likeName ]]>
</query>
session.getNamedQuery("findDeptsByCondition")
.setString("likeName","%a%")
.list();