jpa查询语言
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JPA查询语言(JPQL)
JPQL,SQL和批量处理
白汉奇[译]
目录
概述 (1)
类型 (2)
保留标志符 (4)
路径表达式 (4)
界定变量(Range Variables) (6)
JOINS (6)
INNER JOIN (7)
LEFT OUTER JOIN (7)
FETCH JOIN (8)
WHERE,GROUP BY,HAVING (10)
条件表达式(CONDITIONAL EXPRESSIONS) (10)
函数与表达式(FUNCTIONS AND EXPRESSIONS) (10)
字符串函数(STRING FUNCTIONS) (13)
数学函数(ARITHMETIC FUNCTIONS) (13)
时间函数(DATETIME FUNCTIONS) (14)
SECLECT函数 (14)
构造器函数(CONSTRUCTOR EXPRESSION) (15)
统计函数(AGGREGATE FUNCTIONS) (15)
使用法则(RULES OF USAGE) (16)
排序(ORDER BY) (16)
批量处理(BULK OPERATIONS) (17)
实例 (18)
总结(SUMMARY) (20)
本章探讨Java持久化查询语言(JPQL),在简单的向你介绍JPQL后,会直接切入创建查询这个话题。
本章会涉及一个查询的方方面面,包括fetch join操作。fetch join操作会提前读取延时关
联(lazy relationship),以消除LazyInitializationException异常,这在使用ORM方案时,常
常困扰很多应用程序的开发。接下来,会了解一下JPQL的打量操作支持。学习完本章时,你会对
JPQL有一个全面的认识。
概述
JPQL是一种与数据库无关的,基于实体(entity-based)的查询语言。它是EJB QL的一个扩展,并加
入了很多EJB QL中所没有的新特性。JPQL支持projection(可以查询某个实体的字段而不需要查询
整个实体),批量操作(update和delete),子查询,join,group by和having操作。所有的JPQL操作都
在静态查询(命名查询,named query)和动态查询中得到支持。另外,JPQL支持多态,当读取Rank
会返回SpecialRank和PostCountRank实例(instance)(Rank是一个抽象类,JPQL只返回具体
类)。
JPQL在语法上与SQL相似:“ select from[where][group by][having][order by]
”。如果你熟悉SQL,那么对大部分的JPQL语法也不会陌生。JPQL同样支持SQL类似的函数功能,
如max和min,但是并不能取代SQL。不管如何相似,但两者之间有一个重要的区别,JPQL操作的
是“抽象持久化模型(abstract persistence schema)”,而不是数据库定义的物理模型。抽象持久化模型
通常是用JPA元数据(metadata)在ORM文件中或注释(annotation)中进行定义(有关注释和ORM的更多
信息参见第2章Entities Part I,第3章Entities Part II,第4章Packaging)。抽象持久化模型包括实体,
它们的字段及定义的所有关联关系。JPA持久化工具可以将JPQL转换成内置的SQL查询语句。这
就意味着你可以在查询语句的SELECT指定一个实体或是它的字段,或者在WHERE语句中使用多
个实体。你可以用点号(.)来访问查询语句中的SELECT部分的关联关系。下面这个例子是访问
agoraBB对象模型中从PrivateMessage到User的关联。
SELECT p.toUser FROM PrivateMessage p
这个查询会得到PrivateMessage所属的User。
虽然可以说JPQL可以将所有的操作当成查询,但实际上只有三种不同的“查询”:SELECT查询(真
正可以算得上的一个查询),更新查询(不是查询而是更新语句),或者删除查询(也不是真正的查询
而是删除语句)。JPA规范中将所有的这些查询当成查询,你可以用同样的语法定义这三种查询,
它们之间的差别会反应到数据库上。
本章包含以下话题:
•JPQL概述
•Join
•Where,Group By,Having
•SELECT语句
•批量操作支持
•实例
JPQL操作的就是抽象持久化模型,即一个持久化单元(persistence unit)中实体所表示的模
型。使用SQL,你可以直接查询数据库中表的字段;使用JPQL,你可以查找实体的属性。一个
JPQL语句的各个组成部分都是针对实体或者实体的属性进行操作。你根本不会用到一个实体所映
射的数据库表和字段。下面是你可以创建紧最基本的JPQL语句:
SELECT u FROM User
查询从数据库返回所有的User实例。
注意
除实体名称和实体字段外,JPQL查询不区分大小写。所以在查询的其它部分你可以使用任意形
式。本章中,所有JPA保留标志符我们使用大写,在你的应用程序中并不要求要这么做。
类型
JPQL是一种强类型语言,一个JPQL语句中每个表达式都有类型。
注意
强类型语言中规定某种表达式对某种类型是合法的。如果在Java中编译"123"+3,你会得到一个类
型不相容的编译器错误。