Hibernate 查询语言

hibernate 查询语言

hibernate 查询语言(hql)是一种面向对象的查询语言,类似于 sql,但不是去对表和列进行操作,而是面向对象和它们的属性。

hql 查询被 hibernate 翻译为传统的 sql 查询从而对数据库进行操作。

尽管你能直接使用本地 sql 语句,但我还是建议你尽可能的使用 hql 语句,以避免数据库关于可移植性的麻烦,并且体现了 hibernate 的 sql 生成和缓存策略。

在 hql 中一些关键字比如 select ,from 和 where 等,是不区分大小写的,但是一些属性比如表名和列名是区分大小写的。

 

from 语句

如果你想要在存储中加载一个完整并持久的对象,你将使用 from 语句。以下是 from 语句的一些简单的语法:

string hql = "from employee";
query query = session.createquery(hql);
list results = query.list();

如果你需要在 hql 中完全限定类名,只需要指定包和类名,如下:

string hql = "from com.hibernatebook.criteria.employee";
query query = session.createquery(hql);
list results = query.list();

 

as 语句

在 hql 中 as 语句能够用来给你的类分配别名,尤其是在长查询的情况下。例如,我们之前的例子,可以用如下方式展示:

string hql = "from employee as e";
query query = session.createquery(hql);
list results = query.list();

关键字 as 是可选择的并且你也可以在类名后直接指定一个别名,如下:

string hql = "from employee e";
query query = session.createquery(hql);
list results = query.list();

 

select 语句

select 语句比 from 语句提供了更多的对结果集的控制。如果你只想得到对象的几个属性而不是整个对象你需要使用 select 语句。下面是一个 select 语句的简单语法示例,这个例子是为了得到 employee 对象的 first_name 字段:

string hql = "select e.firstname from employee e";
query query = session.createquery(hql);
list results = query.list();

值得注意的是 employee.firstname 是 employee 对象的属性,而不是一个 employee 表的字段。

 

where 语句

如果你想要精确地从数据库存储中返回特定对象,你需要使用 where 语句。下面是 where 语句的简单语法例子:

string hql = "from employee e where e.id = 10";
query query = session.createquery(hql);
list results = query.list();

 

order by 语句

为了给 hsq 查询结果进行排序,你将需要使用 order by 语句。你能利用任意一个属性给你的结果进行排序,包括升序或降序排序。下面是一个使用 order by 语句的简单示例:

string hql = "from employee e where e.id > 10 order by e.salary desc";
query query = session.createquery(hql);
list results = query.list();

如果你想要给多个属性进行排序,你只需要在 order by 语句后面添加你要进行排序的属性即可,并且用逗号进行分割:

string hql = "from employee e where e.id > 10 " +
             "order by e.firstname desc, e.salary desc ";
query query = session.createquery(hql);
list results = query.list();

 

group by 语句

这一语句允许 hibernate 将信息从数据库中提取出来,并且基于某种属性的值将信息进行编组,通常而言,该语句会使用得到的结果来包含一个聚合值。下面是一个简单的使用 group by 语句的语法:

string hql = "select sum(e.salary), e.firtname from employee e " +
             "group by e.firstname";
query query = session.createquery(hql);
list results = query.list();

 

使用命名参数

hibernate 的 hql 查询功能支持命名参数。这使得 hql 查询功能既能接受来自用户的简单输入,又无需防御 sql 注入攻击。下面是使用命名参数的简单的语法:

string hql = "from employee e where e.id = :employee_id";
query query = session.createquery(hql);
query.setparameter("employee_id",10);
list results = query.list();

 

update 语句

hql hibernate 3 较 hql hibernate 2,新增了批量更新功能和选择性删除工作的功能。查询接口包含一个 executeupdate() 方法,可以执行 hql 的 update 或 delete 语句。

update 语句能够更新一个或多个对象的一个或多个属性。下面是使用 update 语句的简单的语法:

string hql = "update employee set salary = :salary "  +
             "where id = :employee_id";
query query = session.createquery(hql);
query.setparameter("salary", 1000);
query.setparameter("employee_id", 10);
int result = query.executeupdate();
system.out.println("rows affected: " + result);

 

delete 语句

delete 语句可以用来删除一个或多个对象。以下是使用 delete 语句的简单语法:

string hql = "delete from employee "  +
             "where id = :employee_id";
query query = session.createquery(hql);
query.setparameter("employee_id", 10);
int result = query.executeupdate();
system.out.println("rows affected: " + result);

 

insert 语句

hql 只有当记录从一个对象插入到另一个对象时才支持 insert into 语句。下面是使用 insert into 语句的简单的语法:

string hql = "insert into employee(firstname, lastname, salary)"  +
             "select firstname, lastname, salary from old_employee";
query query = session.createquery(hql);
int result = query.executeupdate();
system.out.println("rows affected: " + result);

 

聚合方法

hql 类似于 sql,支持一系列的聚合方法,它们以同样的方式在 hql 和 sql 中工作,以下列出了几种可用方法:

s.n. 方法 描述
1 avg(property name) 属性的平均值
2 count(property name or `*`) 属性在结果中出现的次数
3 max(property name) 属性值的最大值
4 min(property name) 属性值的最小值
5 sum(property name) 属性值的总和

distinct 关键字表示只计算行集中的唯一值。下面的查询只计算唯一的值:

string hql = "select count(distinct e.firstname) from employee e";
query query = session.createquery(hql);
list results = query.list();

 

使用分页查询

以下为两种分页查询界面的方法:

s.n. 方法&描述
1 query setfirstresult(int startposition)
该方法以一个整数表示结果中的第一行,从 0 行开始。
2 query setmaxresults(int maxresult)
这个方法告诉 hibernate 来检索固定数量,即 maxresults 个对象。

使用以上两种方法,我们可以在我们的 web 或 swing 应用程序中构造一个分页组件。下面是示例,您可以扩展到每次取 10 行:

string hql = "from employee";
query query = session.createquery(hql);
query.setfirstresult(1);
query.setmaxresults(10);
list results = query.list();

下一节:hibernate 标准查询

hibernate 教程

相关文章