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语句中的所使用的包名、类名、实例名、属性名都是区分大小写的。