hibernate的查询--HQL查询

前面已对hibernate常用的关系映射做了总结,下面对hibernate常用的HQL查询作一下总结:

1.from子句
说到HQL语句,from子句是最简单的了,例如 from Employee(或:select e from Employee e),表示返回Employee类的所有实例。
例如:
Query query = session.createQuery("from Employee"); 
		List list = query.list(); 
		for (int i=0;i<list.size(); i++) 
		{ 
		Employee employee = (Employee)list.get(i); 
		System.out.println(employee.getName()); 
		} 

注意:如果执行HQL语句"from Employee, Department"是返回这两个对象的的笛卡儿积,这类似于SQL语句中的全外连接。

2.select子句

如果不需要得到对象的所有属性,可以使用select子句进行属性查询。
例如:
Query query = session.createQuery("select e.name from Employee e");
		List list = query.list(); 
		for (Iterator<Employee> iter=list.iterator();iter.hasNext();) 
		{ 
			Employee employee=iter.next();
			System.out.println(employee.getName()); 
		} 

         如果要查询两个以上的属性,查询结果会以数组的方式返回。
例如:
Query query = session.createQuery("select e.name, e.phone from Employee as e"); 
		List list = query.list(); 
		for (int i=0;i<list.size(); i++) 
		{ 
		Object obj[] = (Object[])list.get(i); 
		System.out.println("姓名:"+(obj[0] + "   手机:" +obj[1])); 
		} 

         在查询多个属性时,把字段封装在一个对象中往往比使用对象数组更方便。下面 的程序将多个属性的查询结果进行了实例化:
Query query = session.createQuery("select new Employee(e.name, e.phone) from Employee e"); 
		List list = query.list(); 
		for (int i=0;i<list.size(); i++) 
		{ 
		Employee employee = (Employee)list.get(i); 
		System.out.println("姓名:"+employee.getName()+"   手机:"+employee.getPhone()); 
		} 

但是要正确运行上面的程序,除了需要在Employee类中保留一个没参的构造函数外,还需加入一个如下带参数的构造函数:
public Employee(String name, String phone) 
		{ 
		    this.name = name; 
		    this.phone= phone; 
		} 

3.where子句

HQL也支持子查询,where子句允许你将返回的实例列表的范围缩小:
Query query = session.createQuery("from Employee as e where e.name='Kelly' "); 

where子句允许出现的表达式包括了SQL中可以使用的大多数情况:
例如,下面语句返回所有员工的工资都大于8000的部门对象:
from Department d where 8000<all(select e.wage from d.Employees e) 

下述语句返回在所有员工中有一个员工工资等于8000的部门:
from Department d where 8000=any (select e.wage from d.Employees e) 

或者
from Department d where 8000=some (select e.wage from d.Employees e)

或者
from Department d where 8000 in (select e.wage from d.Employees e) 

4.order by 子句

查询返回的列表可以按照任何返回的类或者组件的属性排序
asc和desc是可选的,分别代表升序和降序。
例如:
from Employee e order by e.name asc 

5.group by子句

             在HQL中也可使用group by子句,例如:
select d.name, avg(e.wage), max(e.wage) from Employee e join e.departments d group by d.name

当然HQL查询也支持having子句:
select d.name, avg(e.wage), max(e.wage) from Employee e join e.departments d group by d.name having d.name in("技术部","销售部")

注意group by子句与 order by子句中都不能包含算术表达式
6.连接查询
与SQL查询一样, HQL也支持连接查询,如内连接、外连接和交叉连接。

inner join: 内连接
left outer join:左外连接
right outer join:右外连接
full join: 全连接,不常用

下面以内连接查询为例,左外连接和右外连接查询和内连接大同小异,而全连接却很少使用。

inner join可以简写为join,例如在查询得到Department对象时,内连接取得对应的Employee对象,核心代码如下。
Employee  employee = null;  
		Department  department = null; 
		Query query = session.createQuery("from Department d join d.Employees"); 
		List list = query.list(); 
		Object obj[] = null;  
		for(int i=0;i<list.size();i++) 
		{ 
			obj = (Object[])list.get(i); 
			department = (Department)obj[0];  //department是数组中第一个对象 
			employee = (Employee)obj[1];      //department是数组中第二个对象  
			System.out.println(employee.getName() + "属于:" +department.getName() ); 
		} 

7.hibernate中常用的表达式:

在where子句中允许使用的表达式包括大多数你可以在SQL使用的表达式种类:
•数学运算符+, -, *, /
•二进制比较运算符=, >=, <=, <>, !=, like
•逻辑运算符and, or, not
•in, not in, between, is null, is not null, is empty, is not empty, member of and not member of
•"简单的" case, case ... when ... then ... else ... end,和 "搜索" case, case when ... then ... else ... end
•字符串连接符...||... or concat(...,...)
•current_date(), current_time(), current_timestamp()
•second(...), minute(...), hour(...), day(...), month(...), year(...),
•SQL标量函数:例如upper()和lower()

如果子查询返回多条记录,可以用以下的关键字来量化:
all:表示所有的记录。
any:表示所有记录中的任意一条
some:与any用法相同。
in:与any等价。
exists:表示子查询至少要返回一条记录。

猜你喜欢

转载自jenhui.iteye.com/blog/1236285