chenssss 2018-10-11
今天主要学习了hibernate的查询语句,只是学习了简单的hql语句的定义和使用。
1.查询语言
Hibernate查询语言(HQL)是一种面向对象的查询语言,类似于SQL,但不是去对表和列进行操作,而是面向对象和它们的属性。HQL查询被Hibernate翻译为传统的SQL查询从而对数据库进行操作。
尽管你能直接使用本地SQL语句,但我还是建议你尽可能的使用HQL语句,以避免数据库关于可移植性的麻烦,并且体现了Hibernate的SQL生成和缓存策略。
在HQL中一些关键字比如SELECT,FROM和WHERE等,是不区分大小写的,但是一些属性比如表名和列名是区分大小写的。
FROM语句
如果你想要在存储中加载一个完整并持久的对象,你将使用FROM语句。以下是FROM语句的一些简单的语法:
String hql = "FROM Employee"; //定义Hql语句 Query query = session.createQuery(hql); // 使用session.createQuery()方法定义query List results = query.list(); //使用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"; //别名定义为E Query query = session.createQuery(hql);//生成query List results = query.list(); //生成list
SELECT语句
SELECT语句比from语句提供了更多的对结果集的控制。如果你只想得到对象的几个属性而不是整个对象你需要使用SELECT语句。下面是一个SELECT语句的简单语法示例,这个例子是为了得到Employee对象的first_name字段:
String hql = "SELECT E.firstName FROM Employee E"; //查询对象的firstName字段 定义别名为 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"; //返回id为10的对象 Query query = session.createQuery(hql); List results = query.list();
ORDERBY语句
为了给HSQ查询结果进行排序,你将需要使用ORDERBY语句。你能利用任意一个属性给你的结果进行排序,包括升序或降序排序。下面是一个使用ORDERBY语句的简单示例:
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC"; //根据对象的salary属性进行降序排列。 Query query = session.createQuery(hql); List results = query.list();
如果你想要给多个属性进行排序,你只需要在ORDERBY语句后面添加你要进行排序的属性即可,并且用逗号进行分割:
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();
GROUPBY语句
这一语句允许Hibernate将信息从数据库中提取出来,并且基于某种属性的值将信息进行编组,通常而言,该语句会使用得到的结果来包含一个聚合值。下面是一个简单的使用GROUPBY语句的语法:
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " + "GROUP BY E.firstName"; Query query = session.createQuery(hql); List results = query.list();
UPDATE语句
HQLHibernate3较HQLHibernate2,新增了批量更新功能和选择性删除工作的功能。查询接口包含一个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只有当记录从一个对象插入到另一个对象时才支持INSERTINTO语句。下面是使用INSERTINTO语句的简单的语法:
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);
Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。