JPQL

什么是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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值