教程 > hibernate 教程 > 阅读:41

hibernate 查询语言——迹忆客-ag捕鱼王app官网

hibernate query language (hql) 是一种面向对象的查询语言,类似于 sql,但 hql 不是对表和列进行操作,而是使用持久对象及其属性。 hql 查询被 hibernate 翻译成常规的 sql 查询,后者反过来对数据库执行操作。

虽然我们可以使用 native sql 在 hibernate 中直接使用 sql 语句,但我建议尽可能使用 hql 以避免数据库可移植性的麻烦,并利用 hibernate 的 sql 生成和缓存策略。

selectfromwhere 等关键字不区分大小写,但 hql 中的表名和列名等属性区分大小写。

from 子句

如果要将完整的持久对象加载到内存中,我们将使用 from 子句。 以下是使用 from 子句的简单语法

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

如果我们需要完全限定 hql 中的类名,只需指定包和类名,如下所示

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

as 子句

as 子句可用于为 hql 查询中的类分配别名,尤其是当有长查询时。 例如,我们之前的简单示例如下

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 子句

要对 hql 查询的结果进行排序,我们需要使用 order by 子句。 可以按结果集中对象的任何属性对结果进行排序,升序 (asc) 或降序 (desc)。 以下是使用 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 子句

query 接口现在包含一个名为 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 中的工作方式相同,以下是可用函数的列表

序号 函数 描述
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();

使用查询进行分页

query接口有两种分页方法。

序号 方法 描述
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();

查看笔记

扫码一下
查看教程更方便
网站地图