什么是JPQL?
JPQL的全称是“Java Persistence Query Language”,
即Java持久性查询语言。JPQL是一种简单的类似于SQL的基于字符串的语言,用于查询实体,以及实体间的关系。
JPQL简单、可读性强,允许编写可移植的查询,不必考虑底层数据存储。JPQL语法与SQL很相似。
语法:
select_clause 返回的结果,可以是一个对象/值的类型
from_clause
范围,可以使用一个或多个变量辅助说明
[where_clause]
[group by_clause]
[having_clause]
[order by_clause]
示例:
select c from Customer c
select c.name from Customer c
select count(c) from Customer c
特殊的例子(高级用法):
背景
:
一个老师有多个学生,一个学生一个老师
1.查询结果返回一个新的对象:
select new IDCard(s.id,s.name) from Student s;
2.多对一的查询(通过多获取一):
查询所有老师是张三,且年龄大于18的学生
select s.teacher from Student s
where s.teacher.name = '张三' and
s.age>18;
3.一对多的查询(通过一方的集合,查询特定的一方):
查询所有教了包括18岁学生的老师
select t from Teacher t, in(t.stuList) [as] s
由于t中的stu是集合,我们不能直接对其进行条件查询,因此使用in
in(CollectionName) [as] identificationVariable
where s.age = 18;
连接查询:
JPQL只支持内连接和左外连接。
内连接:[inner] join path_expression [as]
identification_variable
左外:
left [outer] join path_expression [as]
identification_variable
JPQL将SQL中的join table不支持on,查询的条件写到了where子句中
一般情况下,我们对两个集合(像表一样) 进行连接。
例如上面的例3,查询所有教了18岁学生的老师,等价查询为:
select t from Teacher t
join(t.stuList) s
where s.age = 18;
----------------------------------------------------------------------------------------------------------
执行查询的接口
JPA使用
javax.persistence.Query接口执行查询实例,Query实例的查询交
由EntityManager构建相应的查询语句。该接口拥有多个执行数据查询的接口方法:
》Object getSingleResult():执行SELECT查询语句,并返回一个结果;
》List getResultList():执行SELECT查询语句,并返回多个结果;
》Query setParameter(int position, Object value):通过参数位置号绑定查询语句中的参数,如果查询语句使用了命令参数,则可以使用Query setParameter(String name, Object value)方法绑定命名参数
》int executeUpdate():执行新增、删除或更新操作。
--------------------------------------------------------------------------------------------------------
执行JPQL查询的步骤
1. 使用注入或通过 EntityManagerFactory 实例获取一个 EntityManager 实例。
2. 通过调用相应 EntityManager 的createQuery方法,创建一个 Query 实例。
3. 如果有查询参数,使用相应 Query 的 setParameter 方法进行设置。
4. 如果需要,使用 setMaxResults 和/或 setFirstResult Query 的方法设置要检索的实例的最大数量和/或指定检索的起始实例位置。
5. 如果需要,使用 setHint Query 的方法设置供应商特定的提示。
6. 如果需要,使用 setFlushMode Query 的方法设置查询执行的刷新模式,覆盖实体管理器的刷新模式。
7. 使用相应 Query 的方法 getSingleResult 或 getResultList 执行查询。如果进行更新或删除操作,必须使用 executeUpdate 方法,它返回已更新或删除的实体实例的数量。
查询参数的定义
在JPQL中,查询参数可以分为位置参数和命名参数。位置参数的定义是通过问号(?)加位置来定义。命名参数是通过冒号(:)加参数名来定义。用query的setParameter方法填充其值。
使用位置参数如下所示:
Query query = em.createQuery(“select p from Person p where p.id=
?1”);
query.setParameter(1, 5311);
使用命名参数如下所示:
Query query = em.createQuery(“select p from Person p where p.id=
:
id
”);
query.setParameter(“id”, 5311);
删除和更新
顾客的年龄增加一岁。
String updateQL = "update Customer c set c.age = c.age +1";
Query updateQuery = em.CreateQuery(updateQL);
updateQuery.executeUpdate();
删除id为空的顾客。
String deleteQL = "delete from Customer c where c.id is null";
Query deleteQuery = em.CreateQuery(deleteQL);
deleteQuery.executeUpdate();