首页 > 代码库 > HQL查询——HQL查询的基本用法

HQL查询——HQL查询的基本用法

HQL查询——HQL查询的基本用法

1.HQL语法类似于SQL语法,但是需要注意的是,HQL是一种完全面向对象的查询语言。SQL语言操作的对象是数据表、列等数据库对象,而HQL语言的操作对象是类、实例、属性等。

2.由于HQL语言是面向对象的查询语言,所以他具有面向对象的特征,即支持继承和多态。

3.HQL查询依赖于Hibernate提供的Query类,每个Query类实例对应一个查询对象。

4.使用HQL查询的步骤如下:

(1)获取Hibernate Session对象;

(2)编写HQL语句;

(3)如果以HQL语句作为参数,调用Session的createQuery()方法创建查询对象;

(4)如果HQL语句包含参数,则调用Query的setXxx()方法为参数赋值;

(5)调用Query对象的list()方法或者uniqueResult()方法返回查询结果列表(持久化实体集)。

5.执行HQL查询的例子:

 1 import java.text.SimpleDateFormat;
 2 import java.util.Arrays;
 3 import java.util.Date;
 4 import java.util.List;
 5 
 6 import org.hibernate.Session;
 7 import org.hibernate.Transaction;
 8 
 9 /**
10  * @author admin
11  *    使用HQL查询的例子
12  */
13 public class HqlQuery {
14     public static void main(String[] args)throws Exception {
15         HqlQuery mgr = new HqlQuery();
16         //调用第一个查询方法
17         mgr.findPersons();
18         //调用第二个查询方法
19         mgr.findPersonsByHappenDate();
20         //调用第三个查询方法
21         mgr.findPersonProperty();
22     }
23     //第一个查询方法
24     private void findPersons(){
25         //获得Hibernate Session对象
26         Session session = HibernateUtil.currentSession();
27         //开始事务
28         Transaction tx = session.beginTransaction();
29         //使用HQL语句创建Query对象
30         List pl = session.createQuery("select distinct p from Person p join p.myEvents where title = :eventTitl")
31                 //执行setString方法为HQL语句中的参数赋值
32                 .setString("eventTile", "普通事情")
33                 //使用Query实例的list()方法获取查询的全部实例
34                 .list();
35         //遍历查询的全部结果
36         for(Object ele : pl){
37             Person p = (Person)ele;
38             System.out.println(p.getName());
39         }
40         //提交事务
41         tx.commit();
42         //关闭Session
43         HibernateUtil.closeSession();
44     }
45     //第二个查询方法
46     private void findPersonsByHappenDate()throws Exception{
47         //获取Hibernate Session对象
48         Session session = HibernateUtil.currentSession();
49         //开始事务
50         Transaction tx = session.beginTransaction();
51         //解析出Date对象
52         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
53         Date start = new Date("2017-01-03");
54         //通过Session对象的createQuery()方法创建Query对象
55         List pl = session.createQuery("select distinct p from Person p inner join p.myEvents evebt "
56                 + "where event.happenDate"
57                 + "between:firstDate and :endDate").
58                 //设置参数
59                 setDate("firstDate", start).
60                 setDate("endDate", new Date()).
61                 //返回结果
62                 list();
63         //遍历结果集
64         for(Object ele:pl){
65             Person p = (Person)ele;
66             System.out.println(p.getName());
67         }
68         //提交事务
69         tx.commit();
70         //关闭Session
71         HibernateUtil.closeSession();
72     }
73     //第三个查询方法:属性的查询
74     private void findPersonProperty(){
75         //获得Session对象
76         Session session = HibernateUtil.currentSession();
77         //开始事务
78         Transaction tx = session.beginTransaction();
79         //使用HQL创建Query对象
80         List pl = session.createQuery("select distinct p.id,p.name,p.age"
81                 + "from Person p join p.myEvents")
82                 //Query调用list()方法查询得到的全部属性
83                 .list();
84         //遍历查询的全部结果
85         for(Object ele:pl){
86             Object[] objs = (Object[])ele;
87             System.out.println(Arrays.toString(objs));
88         }
89         //提交事务
90         tx.commit();
91         //关闭Session对象
92         HibernateUtil.closeSession();
93     }
94 }

 6.HQL语句中可以使用占位符作为参数。HQL中的占位符既可以使用英文问号+索引的形式(?N);也可以使用有名字的占位符,使用有名字的占位符时,应该在占位符名字前增加英文冒号(:)。

7.成功编写了HQL语句以后就可以使用Session对象的createQuery(hql)方法创建一个Query,Query对象使用setXxx()方法为HQL语句的参数赋值。Query的所有setXxx()方法都有两个版本,分别用于根据参数索引赋值和根据参数名字赋值。

8.Query对象可以连续为多次的参数赋值,因为Query对象的setXxx()方法返回的依然是一个Query对象本身,在最后使用Query对象的list()方法来获取查询到的全部结果。

9.注意:HQL语句本身是不区分大小写的。即HQL语句的关键字、函数都是不区分大小写的。但是HQL语句中的所使用的包名、类名、实例名、属性名都是区分大小写的。

HQL查询——HQL查询的基本用法