JPQL(JPA Query Language)是面向对象的查询语言,它和SQL查询语言有些相似。在JPA提供的各种检索方式中,JPQL是使用最广的一种检索方式。它具有以下功能:
- 在查询语句中设定各种查询条件。
- 支持投影查询,即仅检索出对象的部分属性。
- 支持分页查询。
- 支持连接查询。
- 支持分组查询,允许使用having和group by关键字。
- 支持调用各种函数。
- 支持子查询,即嵌入式查询。
- 支持动态绑定参数。
以下程序代码用于检索姓名为“Tom”,并且年龄为21的Customer对象:
//创建一个Query对象
Query query=entityManager.createQuery(
"from Customer as c where c.name=:customerName "
+"and c.age=:customerAge");
//动态绑定参数
query.setParameter("customerName","Tom");
query.setParameter("customerAge",21);
//执行查询语句,返回查询结果
List result=query.getResultList();
//遍历访问查询结果
Iterator it=result.iterator();
while(it.hasNext()){
Customer c=(Customer)it.next();
}
从以上程序代码看出,JPQL检索方式包括以下步骤。
(1)通过EntityManager的createQuery()方法创建一个Query对象,它包含一个JPQL查询语句。JPQL查询语句可以包含命名参数,如“customerName”和“customerAge”都是命名参数。
(2)动态绑定参数。Query接口的setParameter()方法可以为各种数据类型的命名参数赋值。
(3)调用Query的getResultList()方法执行查询语句。该方法返回java.util.List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。对于以上程序代码,当运行Query的getResultList()方法时,Hibernate执行以下SQL查询语句:
select ID,NAME,AGE from CUSTOMERS where NAME='Tom' and AGE=21;
Query接口支持方法链编程风格,它的setParameter()方法以及getResultList()等方法都返回自身实例,而不是返回void类型。如果采用方法链编程风格,将按以下形式访问Query接口:
List result=entityManager.createQuery("……")
.setParameter("customerName","Tom")
.setParameter("customerAge",21)
.getResultList();
可见,方法链编程风格能使程序代码更加简洁。
JPQL与SQL在语法形式上有些相似,例如:
JPQL查询语句:from Customer as c where c.name=‘Tom’ and c.age=21
SQL查询语句:select * from CUSTOMERS where NAME=‘Tom’ and AGE=21;
但JPQL与SQL在本质上是不一样的:
-
JPQL查询语句是面向对象的,Hibernate负责解析JPQL查询语句,然后根据对象-关系映射信息,把JPQL查询语句翻译成相应的SQL语句。JPQL查询语句中的主体是域模型中的类以及类的属性。例如在以上JPQL查询语句例子中,“Customer”是持久化类的名字,“c.age”是持久化类的属性的名字。
-
SQL查询语句是与关系数据库绑定在一起的。SQL查询语句中的主体是数据库表以及表的字段。例如在以上SQL查询语句例子中,“CUSTOMERS”是表的名字,“AGE”是表的字段的名字。