JPA基础(六)之JPA的jpql语言

JPQL介绍

在 Java EE 中,JPQL(Java 持久性查询语言)是专门为 Java 应用程序访问和导航实体实例设计的。JPQL 是 EJB2 使用的查询语言 EJB QL 的扩展,它继承了 EJB QL 并对其做了一些改变。

JPQL 与 SQL

JPQL 和 SQL 有很多相似之处。归根结底,它们都用于访问和操作数据库数据。而且,二者都使用非过程语句 — 通过特殊解释程序识别的命令。此外,JPQL 在语法上与 SQL 也相似。JPQL 和 SQL 的主要区别在于,前者处理 JPA 实体,后者直接在数据库空间内对表、列、行等关系数据进行处理。

使用 JPQL

要从 Java 代码内发出 JPQL 查询,您需要利用 EntityManager API 和 Query API 的相应方法,执行以下一般步骤:

  1. 使用注入或通过 EntityManagerFactory 实例获取一个EntityManager 实例。
  2. 通过调用相应 EntityManager 的方法(如 createQuery),创建一个 Query 实例。
  3. 如果有查询参数,使用相应 Query 的 setParameter 方法进行设置。
  4. 如果需要使用 setMaxResults 和/或 setFirstResult 方法设置要检索的实例的最大数量和/或指定检索的起始实例位置。
  5. 如果需要使用 setHint()方法设置供应商特定的提示。
  6. 如果需要使用 setFlushMode( ) 方法设置查询执行的刷新模式,覆盖实体管理器的刷新模式。
  7. 执行查询使用相应 Query 的方法 getSingleResult 或 getResultList 。
  8. 进行更新或删除操作,使用 executeUpdate 方法,它返回已更新或删除的实体实例的数量。

JPQL 的查询可以分为命名查询和动态查询

动态查询

可以使用 EntityManager.createQuery 方法创建动态查询,唯一的要求是把合法的JPQL 语句传递给此方法。如下:
Query query = em.createQuery(“select p from Person p where p.id=1033”);
其中 where 语句是可选的。在这里 JPQL 看上去和 SQL 语句很像,但应当注意到的是 from 后边的 Person 是实体 Bean 而不是数据表。
在所写的 JPQL 语句中你可以像示例中那样的直接将查询条件写在语句中。但是还有更好的
方法。在这里你可以使用设置查询参数的方式,其中又有位置参数和命名参数的分别。

使用位置参数如下所示:
Query query = em.createQuery(“select p from Person p where p.id=?1”);
Query.setParameter(1, 1033);//第一个参数是位置,第二个参数查询条件

使用命名参数如下所示:
Query query = em.createQuery(“select p from Person p where p.id=:id”);
Query.setParameter(“id”, 1033);//第一个参数是参数名称,第二个参数查询条件需要注意的是位置参数的是位置前加符号”?”,命名参数是名称前是加符号”:”。如果你需要传递 java.util.Date 或 java.util.Calendar 参数进一个参数查询,你需要使用一个特殊的 setParameter()方法。因为一个 Date 或 Calendar 对象能够描述一个真实的日期、时间或时间戳.所以我们需要告诉 Query 对象怎么使用这些参数,我们把javax.persistence.TemporalType 作为参数传递进 setParameter 方法,告诉查询接口在转换 java.util.Date 或 java.util.Calendar 参数到本地 SQL 时使用什么数据库类型

查询结果

使用 Query. getSingleResult 方法得到查询的单个实例,返回 Object。要确保使用此方法时查询只检索到一个实体。
使用 Query. getResultList 方法得到查询的实例集合,返回 List。
通常的,我们会如示例中所示的是获取查询返回的是实体,但是在 JPQL 里我们也可以得到实体的部分属性,就如同使用 SQL 得到表中的部分列一样。如果是获取部分属性的话,Query.getResultList 方法返回的会是 Object 数组的 List 每个 Object 数组项相当于是一条结果,数组的成员是属性值,顺序和所写的 JPQL 中的 SELECT 中所写顺序一致

查询中使用构造器

可以在 SELECT 子句中使用构造器返回一个或多个 java 实例。如下所示:
Query query = em.createQuery(“select new com.demo.bean.Person(p.id, p.name) from Person p order by p.id desc”);

查询分页

JPA 提供了在结果集合中使用分页的功能,使用这个功能我们可以轻松的达到对查询结果分页的目的。如下
Query.setMaxResults(10);//设置分页大小,在这里为每页 10 条记录
Query.setFirstResult(10);//指定第一个结果的位置。这里是指定第 11 条作为起始结果。
这里只要在 setFirstResult 中使用动态参数即可方便的对结果进行分页了。

操作符

在 where 子句中我们可以使用一些操作符来进行条件的选择。

NOT 操作符
//查询 id 不是 1036 的所有人
select p from Person p where not(p.id = 1036)

BETWEEN 操作符
//查询年龄在 20 到 26 的所有人;上限和下限必须是相同的数据类型
select p from Person p where p.age between 20 and 26

IS NULL 操作符
//查询年龄在 20 到 26 的所有人;上限和下限必须是相同的数据类型
select p from Person p where p.age between 20 and 26

IS NULL 操作符
//查询名字不为 NULL 的所有人
select p from Person p where p.name is not null

IS EMPTY 操作符
IS EMPTY 是针对集合属性(Collection)的操作符。可以和 NOT 一起使用。注:低版权的
MySQL 不支持 IS EMPTY
//查询兴趣(是集合)是空的所有人
select p from Person p where p.interest is empty

IN 操作符
//查询 id 是 101 和 102 的人
select p from Person p where p.id in (101,102)

EXISTS 操作符
[NOT]EXISTS 需要和子查询配合使用。注:低版权的 Mysql 不支持 EXISTS
//如果书籍名字中包含有 EJB 字样,则得到所有人
select p from Person p where exists (select b from Book b where b.name
like ‘%EJB%’ )

MEMBER OF 操作符
可以使用 MEMBER OF 操作符检查集合-值路径表达式中是否存在标识符变量、单一值表达式或是输入参数。
//查询兴趣(是集合)是中包含所输入的兴趣实体实例(:interest)的所有人
select p from Person p where :interest member of p.interest

字符串函数

JPQL 定义了内置函数方便使用。这些函数的使用方法和 SQL 中相应的函数方法类似。包括:

  1. CONCAT 字符串拼接
  2. SUBSTRING 字符串截取
  3. TRIM 去掉空格
  4. LOWER 转换成小写
  5. UPPER 装换成大写
  6. LENGTH 字符串长度
  7. LOCATE 字符串定位
算术函数

JPQL 仅仅支持了最低限度的算术函数集合,可以在 JPQL 的 where 和 having 子句中使用算术函数。JPQL 定义的算术函数包括:
ABS 绝对值
SQRT 平方根

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值