HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL语言有些相似。在Hibernate提供的各种检索方式中,Hibernate是使用最广的一种检索方式。
在查询语句中设定各种查询条件
支持投影查询,即仅检索出对象的部分属性
支持分页查询
支持连接查询
支持分组查询,提供内置聚集函数
能够调用用户定义的SQL函数
支持子查询
支持动态绑定参数
Session的 find() 方法以及 Query 接口都支持HQL查询。
find() 方法只是执行一些简单的HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在 Hibernate 3.x 版本中,已经淘汰了 find() 方法。
Query接口才是真正的HQL查询接口,它属于一个泛型接口,使用时要指定具体的类型,此接口提供了 find() 方法列出的各种查询方法。在5.2.0版本的Hibernate中,我们打开开发包中 documentation->javadocs 目录可以查看 Hibernate 的API。在5.2.0这个版本我们能看到有两个Query接口,一个位于 org.hibernate 包下,一个位于 org.hibernate.query 包下,但是 org.hibernate.Query 已经用@deprecated注解,表示不赞成使用,而是推荐使用 org.hibernate.query.Query接口,实际上该接口继承了 org.hibernate.query 接口。
创建Query对象:Query Session.createQuery(String queryString)
Query接口的常见方法
setParameter();
为查询的SQL语言之中的占位符设置参数
List getResultList();
返回一个查询的集合
Object uniqueResult();
返回一个单一的查询结果
因为HQL是面向对象的查询语言,所以不需要指定具体的表和栏位,而是指定具体的实体类和属性,实际上我们在对象映射文件中做了相应的对应关系映射,所以说,原理上是一样的。
注意:导入的是org.hibernate.query.Query接口
首先使用 Session 对象的 createQuery() 方法来创建 Query 对象,因为 Query 是泛型接口,所以需指定具体的返回类型,除此之外,我们还需要在方法的参数中指定HQL语句和返回类型对应的class对象。
如果是查询单一的对象,那么需要使用 Query 的 uniqueResultOptional() 方法来返回 一个 java.util.Optional 接口对象,该接口的 get() 方法即可放回查询到的对象。
注意:此处对象中的属性并不是对象的成员变量,也就是说不是attribute而是property,是成员变量对应的getter/setter方法按规则去掉get/set之后得到的property name,当然,一般情况下,此property name和成员变量是相同的。
public void queryObject() {
Session session = HibernateSessionFactory.getSession();
Transaction trans = null;
try {
// 启动事务1
trans = session.beginTransaction();
/* 可以使用"?"指定所有类型参数,也可以具体的类型 */
/*注意这里使用的是查询对象,以及对象的属性,而不是数据表和栏位,这就是面向对象查询,没有指定查询的具体属性就查询所有属性*/
/*还需指定查询返回的对象的class类型*/
Query query = (Query) session.createQuery("from Student where id='2016'", Student.class);
/*单一结果查询,返回的是一个接口*/
Optional optional = query.uniqueResultOptional();
Student s = optional.get();
System.out.println(s);
System.out.println("******************************");
// /*使用占位符*/
// query=(Query) session.createQuery("from Student s where s.id=?", Student.class);
// /*根据占位符位置设置参数,占位符从0开始*/
// query.setParameter(0, "2015");
// /*预留参数*/
// query=(Query) session.createQuery("from Student s where s.id=:p", Student.class);
// /*根据预留参数名字设置参数*/
// query.setParameter("p", "2015");
/*推荐使用*/
/*给占位符指定索引位置(自己随意指定)*/
query=(Query) session.createQuery("from Student s where s.id=?2", Student.class);
query.setParameter(2, "2015");
optional = query.uniqueResultOptional();
s=optional.get();
System.out.println(s);
trans.commit();
} catch (Exception e) {
e.printStackTrace();
trans.rollback();
}
}
我们可以使用 Query 接口的 getResultList() 方法来返回一个 List集合。
/*集合查询,返回的是一个List集合*/
public void queryList() {
Session session = HibernateSessionFactory.getSession();
Transaction trans = null;
try {
// 启动事务1
trans = session.beginTransaction();
Query query=(Query)session.createQuery("from Student", Student.class);
List list=query.getResultList();
System.out.println(list);
System.out.println("************");
/*根据条件的集合查询*/
query=(Query)session.createQuery("from Student where gender=?1 and age=?2", Student.class);
query.setParameter(1, "female");
query.setParameter(2, 20);
list=query.getResultList();
System.out.println(list);
System.out.println("************");
/*根据条件的集合查询*/
query=(Query)session.createQuery("from Student s where s.name like ?1 and s.age2", Student.class);
query.setParameter(1, "L%");
query.setParameter(2, 22);
list=query.getResultList();
System.out.println(list);
trans.commit();
} catch (Exception e) {
e.printStackTrace();
trans.rollback();
}
}
/*其他的SQL语句*/
public void otherSQL() {
Session session = HibernateSessionFactory.getSession();
Transaction trans = null;
try {
// 启动事务1
trans = session.beginTransaction();
/*查询数目,注意:返回的是一个Long类型*/
Query query=(Query)session.createQuery("select count(*) from Student", Long.class);
Optional optional=query.uniqueResultOptional();
System.out.println(optional.get());
System.out.println("*************");
/*插询某一具体的属性(对应栏位)*/
Query query01=(Query)session.createQuery("select name from Student", String.class);
List list=query01.getResultList();
System.out.println(list);
trans.commit();
} catch (Exception e) {
e.printStackTrace();
trans.rollback();
}
}