前面已对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:表示子查询至少要返回一条记录。
分享到:
相关推荐
hibernate查询语句--HQL hibernate查询语句--HQL
hibernate查询-hql等教程,对于学习hibernate有很好的帮助。
hibernate3-hql.jar .
Hibernate HQL 查询 Query 资料 3个word总结的资料。
hibernate-HQL语句大全
hibernate查询之HQLhibernate查询之HQLhibernate查询之HQL
hibernate 查询语言 HQL的使用详解及实例, 个人笔记,适合初学者
一个关于Hibernate-HQL 的文档 内容实际而且实用
HQL的全称是? 和SQL相比,HQL有哪些特点? HQL语句为:select jd.jdid,jd.jd from TblJd jd。怎样获得并显示查询结果? 使用'?'做占位符的参数查询,怎样设置参数的值? 命名参数查询的语法是? 怎样创建Criteria...
Hibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询.docxHibernate HQL查询 分页查询 模糊查询....
Hibernate hql查询语法总结 Hibernate hql查询语法总结
用于调试hql的eclipse插件 把文件解压到eclipse插件目录, 把里面的hibernte.jar copy到工程目录下面, 并添加环境变量, 重启eclipse, 在show-window中可以看到hibernator的视图 connection view hibernator query...
NULL 博文链接:https://awfrun.iteye.com/blog/690632
hibernate hql 语言大全 hql学习,这个文档是一个很全面,很不错的
pact-jvm.zip,pact模型
sbt-junit.zip,面向junit的sbt测试接口的sbt-junitan实现
Hibernate中的关联查询实际上生成的是数据库表连接查询的SQL语句
Hibernate查询语言HQL.PPT
Hibernate案例与专题-HQL语句。详细介绍了HibernateHQL语句。
HQL是hibernate自己的一套查询