没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
详解 JPA 2.0 动态查询机制:Criteria API
自从于年首次被引入之后,它就得到了开发社区的广泛支持。该
规范的下一个主要更新——版本将在年年底完成。
引入的关键特性之一就是,它为语言带来了一种独特的能力:
开发一种编译器可以在运行时验证其正确性的查询。还提供一
个能够在运行时动态地构建查询的机制。
本文将介绍和与之密切相关的
元模型(
metamodel
)
概念。您将学
习如何使用开发编译器能够检查其正确性的查询,从而减少运
行时错误,这种查询优于传统的基于字符串的 !!
查询。借助使用数据库函数或匹配模板实例的样例查询,我将演示编程
式查询构造机制的强大威力,并将其与使用预定义语法的 查询进行对比。
本文假设您具备基础的语言编程知识,并了解常见的使用,比如
"#$!%&或"#$!。
JPQL 查询有什么缺陷?
引进了 ,这是一种强大的查询语言,它在很大程度上导致了的
流行。不过,基于字符串并使用有限语法的 存在一些限制。要理解
的主要限制之一,请查看清单中的简单代码片段,它通过执行 查询选择
年龄大于岁的&列表:
清单 1. 一个简单(并且错误)的 JPQL 查询
EntyManager'()
!*+,-(.select p from Person where p.age > 20.)
Query,('*+,-)
-(,!- )
这个基础的例子显示了中的查询执行模型的以下关键方面:
查询被指定为一个!(第行)。
"#$!是构造一个包含给定 字符串的
可执行
查询实例的工
厂(第行)。
查询执行的结果包含无类型的*#- 的元素。
但是这个简单的例子有一个验证的错误。该代码能够顺利通过编译,但将在运
行时
失败
,因为该 查询字符串的语法有误。清单的第行的正确语法为:
!*+,-(.select p from Person p where p.age > 20.)
不幸的是,编译器不能发现此类错误。在运行时,该错误将出现在第或
第/行(具体行数取决于提供者是否在查询构造或执行期间根据 语法
解析 字符串)。
类型安全查询如何提供帮助?
的最大优势之一就是禁止构造语法错误的查询。清单使用
接口重新编写了清单中的 查询:
清单 2. 编写 CriteriaQuery 的基本步骤
EntyManager'(
QueryBuilder,0('!1-2)
CriteriaQuery3&4(,0&-)
Root3&4+(5&'&-)
Predicate&2#&(,0!+!Person_.age6)
78&2#&)
TypedQuery3&4,(')
3&4-(,!- )
清单展示了的核心构造及其基本使用:
第行通过几种可用方法之一获取一个"#$!实例。
在第行,"#$!创建1-2的一个实例。1-2
是的工厂。
在第行,1-2工厂构造一个实例。
被赋予泛型类型。泛型参数声明在执行时返回的结果的类
型。在构造时,您可以提供各种结果类型参数——从持久
化实体(比如&-)到形式更加灵活的90*:;。
第/行在实例上设置了
查询表达式
。查询表达式是在一个
树中组装的核心单元或节点,用于指定。图显示了在
中定义的查询表达式的层次结构:
图 1. 查询表达式中的接口层次结构
点击查看大图
首先,将设置为
从
&-查询。结果返回&&3
&4实例+。&&是一个查询表达式,它表示持久化实体的范围。
&&3<4实际上表示:“对所有类型为<的实例计算这个查询。”这类似
于 或 查询的%9$子句。另外还需要注意,&&3&4是泛
型的(实际上每个表达式都是泛型的)。类型参数就是表达式要计算的
值的类型。因此&&3&4表示一个对&-进行计算的表达
式。第=行构造一个2。2是计算结果为或5-的
常见查询表达式形式。谓词由1-2构造,1-2不仅是
的工厂,同时也是查询表达式的工厂。1-2包含构
造传统 语法支持的所有查询表达式的方法,并且还包含额外的
方法。在清单中,1-2用于构造一个表达式,它将计算第一
个表达式参数的值是否大于第二个参数的值。方法签名为:
2!">+&3?>2@'04>6@'0)
这个方法签名是展示使用强类型语言(比如)定义能够检查正确性
并阻止错误的的好例子。该方法签名指定,仅能将值为@'0的表
达式与另一个值也为@'0的表达式进行比较(例如,不能与值为
!的表达式进行比较):
2&2#&(,0!+!&A!6)
第=行有更多学问。注意,0!方法的第一个输入参数:
+!&A!,其中+是先前获得的&&3&4表达式。
+!&A!是一个
路径表达式
。路径表达式是通过一个或多个持
久化属性从根表达式进行导航得到的结果。因此,表达式
+!&A!表示使用&的!属性从根表达式+导航。您可
能不明白&A!是什么。您可以将其暂时看作一种表示&的
!属性的方法。我将在谈论引入的新$'&2-时详细解
释&A!。
如前所述,每个查询表达式都是泛型的,以表示表达式计算的值的类型。
如果&-中的!属性被声明为类型!(或),则表达
式+!&A!的计算结果的类型为!。由于中的类型安
全继承,编辑器本身将对无意义的比较抛出错误,比如:
2&2#&(,0!+!&A!6.>B.)
第行在上将谓词设置为其CD""子句。
在第行中,"#$!创建一个可执行查询,其输入为
。这类似于构造一个输入为 字符串的可执行查询。但
是由于输入包含更多的类型信息,所以得到的结果是
<+2,它是熟悉的*>+的一个扩展。如其名所
示,<+2知道执行它返回的结果的类型。它是这样定义的:
+0-5<+23<4>2E
3<4!- )
F
与对应的无类型超接口相反:
+0-5E
!- )
F
很明显,<+2结果具有相同的&-类型,该类型在构造
输入时由1-2指定(第行)。
在第G行中,当最终执行查询以获得结果列表时,携带的类型信息展示
了其优势。得到的结果是带有类型的&列表,从而使开发人员在遍
历生成的元素时省去麻烦的强制类型转换(同时减少了
-">+#&运行时错误)。
现在归纳清单中的简单例子的基本方面:
是一个查询表达式节点树。在传统的基于字符串的查询语
言中,这些表达式节点用于指定查询子句,比如%9$、CD""和
9H"1I。图显示了与查询相关的子句:
图 2. CriteriaQuery 封装了传统查询的子句
查询表达式被赋予泛型。一些典型的表达式是:
o &&3<4,相当于一个%9$子句。
剩余21页未读,继续阅读
资源评论
- uboot_linux2016-05-13谢谢哈。可以参考参考
- jerry70332014-07-21还不错,jpa查询不错
- learnCodingForever2016-07-20可以学习下,sring data基础
StormNing
- 粉丝: 0
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功