一. 函數
聚合函數:count(),avg(),sum(),min(),max()
例:(1)查詢Dept表中的所有的記錄條數。
String hql=" select count(*) from Dept ";
Long count=(Long)session.createQuery(hql).uniqueResult();
當不確定返回的是什么類型的時候可以根據:變量名.getClass()方法得到類型
例如:count.getClass() 返回的是:java.lang.Long
(2)查詢所有員工的工資總和。
String hql="select sum(salary) from Emp";
Double salary=(Double)session.createQuery(hql).uniqueResult();
(3)查詢員工最低的工資。
String hql="select min(salary) from Emp";
Double salarymin=(Double)session.createQuery(hql).uniqueResult();
(4)查詢員工最高的工資
String hql="select max(salary) from Emp";
Double salarymax=(Double)session.createQuery(hql).uniqueResult();
(5)查詢員工的平均工資
String hql="select avg(salary) from Emp";
Double salaryavg=(Double)session.createQuery(hql).uniqueResult();
(6)查詢員工最低工資,最高工資和平均工資
String hql="select min(salary),max(salary),avg(salary) from Emp";
Object[] obj=(Object[])session.createQuery(hql).uniqueResult();
System.out.println(obj[0]+"\t"+obj[1]+"\t"+obj[2]);
二.分組查詢
(1)按職位統計員工個數
String hql="select job,count(e) from Emp e group by job";
List(Object[]) list=session.createQuery(hql).list();
for(Object[] obj:list){
System.out.println(obj[0]+"\t"+obj[1]);
}
Query的list()方法返回的集合包含2個Object[]對象數組類型的元素,每個對象數組對應查詢結果中的一條記錄,數組的第一個元素是
job職位名稱,第二個元素是count(e)員工個數。
查詢結果:
ENGINEER 9
SALES 12
(2)查詢各個部門的平均工資。
String hql="select e.dept.deptName,avg(e.salary) from Emp e group by e.dept.deptName";
Iterator<Object[]> list=session.createQuery(hql).list().iterator();
while(list.hasNext()){
Object[] obj=list.next();
System.out.println(obj[0]+"\t"+obj[1]);
}
Query的list()方法返回的集合中包含3個Object[]對象數組類型的元素,每個對象數組對應查詢結果中的一條記錄,數組中的第一個元
素是e.dept.deptName部門名稱,第二個元素是avg(e.salary)員工平均工資
查詢結果:
研發部 3250.0
市場部 5000.0
財務部 3000.0
(3)查詢各個職位的最低工資和最高工資
String hql="select job,min(e.salary),max(e.salary) from Emp e group by job";
Iterator<Object[]> list=session.createQuery(hql).list().iterator();
while(list.hasNext()){
Object[] obj=list.next();
System.out.println(obj[0]+"\t"+obj[1]+"\t"+obj[2]);
}
查詢結果:
ENGINEER 4900.0 5100.0
SALES 2900.0 3100.0
Query的list()方法返回的集合包含2個Object[]對象數組類型的元素,每個對象數組對應查詢結果中的一條記錄,數組的第一個元素是
job職位名稱,第二個元素是min(e.salary)員工最低工資,第三個元素是max(e.salary)員工最高工資。
(4)查詢各個部門平均工資高於4000元的部門名稱,輸出部門名稱和部門平均工資
String hql="select e.dept.deptName,avg(e.salary) from Emp e group by e.dept.deptName having avg(e.salary)>4000";
List<Object[]> list=session.createQuery(hql).list();
for(Object[] obj:list){
System.out.println(obj[0]+"\t"+obj[1]);
}
查詢結果:
市場部 4987.5
三.子查詢(any():返回任意一條記錄 all():返回的所有記錄 some:和“any”意思相同 in:與“=any”意思相同
exists:至少返回一條記錄)
(1)查詢所有員工工資小於5000的部門
String hql="from Dept d where 5000>all(select e.salary from d.emps e)";
List<Dept> list=session.createQuery(hql).list();
for(Dept dept:list){
System.out.println(dept.getDeptName());
}
在這里不明白用什么類型的來接收,就用上面提到的方法:變量名.getClass()方法得到
根據部門表查詢出工資低於5000的部門,根據導航屬性可以得到員工的集合,在單獨比較工資,即可得到數據。
最不好理解的地方就是where條件后面的語句,只要仔細分析就可以明白。
查詢結果:
財務部
(2)查詢至少有一位員工的工資低於5000的部門
String hql="from Dept d where 5000>any(select e.salary from d.emps e)";
List<Dept> list=session.createQuery(hql).list();
for(Dept dept:list){
System.out.println(dept.getDeptName());
}
得到結果:
研發部
財務部
市場部
(3)查詢有員工工資正好是5000元的部門
String hql="from Dept d where 5000=any(select e.salary from d.emps e)";
List<Dept> list=session.createQuery(hql).list();
for(Dept dept:list){
System.out.println(dept.getDeptName());
}
其中hql語句也可以這樣寫:
String hql="from Dept d where 5000=some(select e.salary from d.emps e)";
或者:
String hql="from Dept d where 5000 in (select e.salary from d.emps e)";
得到結果:
市場部
(4)查詢至少有一位員工的部門
String hql="from Dept d where exists (from d.emps e)";
List<Dept> list=session.createQuery(hql).list();
for(Dept dept:list){
System.out.println(dept.getDeptName());
}
查詢結果:
市場部
研發部
財務部
四.操作集合的函數和屬性
{
size()和size:獲取集合中元素的數目
minElement()和minElement:對於包含基本類型元素的集合,獲得集合中取值最小的元素
minIndex()和minIndex:對於建立了索引的集合,獲得最小的索引
maxIndex()和maxIndex:對於建立了索引的集合,獲得最大的索引
maxElement和maxElement:對於包含基本類型元素的集合,獲得集合中取值最大的元素
elements():獲取集合中的所有元素
}
(1)查詢指定員工所在的部門
Emp emp=new Emp();
emp.setEmpNo(1);
String hql="from Dept d where ? in elements(d.emps)";
List<Dept> list=session.createQuery(hql).setParameter(0,emp).list();
for(Dept dept:list){
System.out.println(dept.getDeptName());
}
查詢結果:
市場部
(2)查詢員工個數大於5的部門
String hql="from Dept d where d.emps.size>5";
List<Dept> list=session.createQuery(hql).list();
for(Dept dept:list){
System.out.println(dept.getDeptName());
}
查詢結果:
研發部
市場部
五.原生SQL查詢和命名查詢
原生SQL查詢:
(1)查詢員工姓名中帶有e的,並且職位為ENGINEER的員工
String sql="select * from EMP where ENAME like :ename and JOB:job";
List<Object[]> list=session.createSQLQuery(sql).setString("ename","%e%").setString("job","ENGINEER").list();
for(Object[] obj:list){
System.out.println(obj[0]+"\t"+obj[1]);
}
查詢結果:
0 emp0
1 emp1
2 emp2
原生SQL查詢和HQL查詢都使用了Query接口,對於原生SQL 查詢方式,使用Session的createSQLQuery()方法來創建SQLQuery對
象,createSQLQuery()方法的參數是本地底層數據庫的SQL語句,Hibernate支持SQL語句使用命名參數和占位符“?”,SQLQuery
接口繼承了Query接口。
SQLQuery接口的list()方法返回的List集合中存放的是關系數據,這些數據分別裝載在3個Object[]對象數組中,每個數組對應查詢結
果集中的一行,行中的每一列都是Object類型。其中SQLQuery接口提供了addEntity()方法把查詢結果集中的關系數據映射為對象。
(2)使用addEntity()方法把關系數據映射為對象
String sql="select * from EMP where ENAME LIKE :ename and JOB:job";
List<Emp> list=session.createSQLQuery(sql).addEntity(Emp.class).setString("ename","%e%")
.setString("job","ENGINEER").list();
for(Emp emp:list){
System.out.println(emp.getEmpName());
}
查詢結果:
0 emp0
1 emp1
2 emp2
(3)查詢指定職位的員工,並輸出員工姓名和部門名稱
String sql="select {e.*},{d.*} from EMP e join DEPT d on d.DEPTNO=e.DEPTNO where e.JOB=:job";
List<Object[]> list=session.createSQLQuery(sql).addEntity("e",Emp.class).addJoin("d","e.dept")
.setString("job","ENGINEER").list();
for(Object[] obj:list){
System.out.println(obj[0].getClass()+"\t"+obj[1].getClass());
}
使用SQLQuery接口的addJoin()方法,建立了Emp對象和Dept對象之間的關聯,list()方法放回的List集合中存放的是Object[]
數組對象,數組的第一個元素是Emp對象,第二個元素是Dept對象。
六.命名查詢
Hibernate支持在映射文件中定義字符串形式的查詢語句,這樣的查詢語句稱為命名查詢語句。
命名查詢語句可以是原生SQL語句查詢,也可以是HQL語句查詢
(1)查詢指定職位的員工
Emp.hbm.xml配置一個和<class>元素並列的<Query>元素
<query name="findEmp">
from Emp e where e.job:job
</query>
List<Emp> list=session.getNamedQuery("findEmp").setString("job","ENGINEER").list();
for(Emp emp:list){
System.out.println(emp.getEmpName());
}
查詢結果:
emp0
emp1
emp2
(2)原生SQL查詢語句的命名查詢
Emp.hbm.xml
<sql-query name="findEmp">
<return alias="e" class="Emp">
select {e.*} from EMP e where e.job=:job
</sql-query>
List<Emp> list=session.getNamedQuery("findEmp").setString("job","ENGINEER").list();
for(Emp emp:list){
System.out.println(emp.getEmpName());
}
查詢結果:
emp0
emp1
emp2