jpa查询语言2

NNER, LEFT, GROUP,
BY, HAVING, FETCH, DISTINCT, OBJECT, NULL, TRUE, FALSE, NOT, AND, OR,
BETWEEN, LIKE, IN, AS, UNKNOWN, EMPTY, MEMBER, OF, IS, AVG, MAX, MIN,
SUM, COUNT, ORDER, BY, ASC, DESC, MOD, UPPER, LOWER, TRIM, POSITION,
CHARACTER_LENGTH, CHAR_LENGTH, BIT_LENGTH, CURRENT_TIME, CURRENT_DATE,
CURRENT_TIMESTAMP, NEW, EXISTS, ALL, ANY, SOME.

UNKNOWN目前在JPQL中还没有用到。


路径表达式
路径表达式就是一个标识符号紧跟一个访问操作符(.)再紧跟一个状态字段或是关联字段。只要它们不是集合(collections),就可以遍历关系。下图是agoraBB项目对象模型的一部分,用于解释路径表达式。


图 1. 路径表达式模型实例


PrivateMessage所属于的User的关系是由PrivateMessage的关联关系字段toUser表示的。User有一个关联到Role的集合关联字段roles,还有一个关联到UserIpAddress的字段userIpAddress。

由于在在这些关系,你可以进行以下操作。


PrivateMessage所属用户User的IP地址UserIpAddresses

SELECT p.toUser.userIPAddresses from PrivateMessage pPrivateMessage所属用户User的角色Role

SELECT p.toUser.roles from PrivateMessage pUser的角色Role,获取所有的无重复的角色名称。

SELECT DISTINCT r.name FROM User u JOIN u.roles rUser的IP地址UserIpAddresses

SELECT DISTINCT u.userIPAddresses FROM User u下图关系略有不同。


图 2. 路径表达式模型实例2


图中,论坛Forum与其主题Topics的关系由Forum的字段topics表示,从Topics到Post的关系由Topic的字段topics表示。从对象关系图可以看出哪些JPQL是合法的,哪些不合法。


查询论坛Forum的主题Topic,要获取标题(subject):路径表达是不合法的,不能直接通过集合访问。

SELECT f.topics.subject FROM Forum f – ILLEGAL查询论坛Forum主题Topic的帖子Post,使用JOIN操作符,表达式是合法的。

SELECT t.subject FROM Forum f JOIN f.topics AS t查询论坛Forum主题Topic的帖子Post,,路径表达是不合法的,不能直接通过集合访问。

SELECT f.topics.posts FROM Forum f – ILLEGAL查询论坛Forum主题Topic的帖子Post,使用JOIN操作符,表达式是合法的。

SELECT p FROM Forum f JOIN f.topics t JOIN t.posts p

注意
虽然JPA规范中明确表示无法访问一个集合关系字段,据我在Hibernate和Toplink上的测试,在一个目标实体中可以访问集合关联字段或状态字段。在JPA的BNF范式针对路径访问指明了从Forum访问Topic,所以读取主题就是非法的。如果你要访问一个集合字段的目标,使用第二个例子如示JOIN语法。

总之,你可以使用导航操作符(.)来遍历实体对象关系图,查询的类型是由SELECT语句决定的。SELECT语句可以包含标识变量和路径表达式。路径表达式可以遍历整个对象关系图,只要你从左到右访问的是单值关联字段,你无法访问一个集合字段或是一个状态关联字段。


界定变量(Range Variables)
界定变量使用与&SQL相似的语法,将实体名绑定到一个标志符上。界定变量声明如下(在一个查询语句的SELECT语句):



entityName [AS] identification_variable 你可以通过使用多个界定变量来使用同一实体,下面的例子来自JPA规范。



SELECT DISTINCT o1FROM Order o1, Order o2WHERE o1.quantity > o2.quantity ANDo2.customer.lastname = ‘Smith’ ANDo2.customer.firstname= ‘John’ 此查询返回大于John Smith的定单的所有的订单。


JOINS
join出现在两个或多个实体联合查询产生一个JPQL查询结果。JPQL中join与SQL中的SQL相似。最后,要说明的是,所有的JPQL会转换成SQL查询。出现以下情况时,就可以用上join。


访问集合关联字段的路径表达式出现在SELECT语句

join保留字出现在WHERE语句中

定义两个或多个界定变量

如果你在一个查询中使用了一个以上的实体,你会获取所有实体的实例。这一结果称为Cartesian product(卡笛尔产品)。假使你的系统中有8个角色和4个用户,下面的查询会得到32个对象。



SELECT r, u FROM Role r, User u 你可能想用某种join来减少查询结果的数量。如果你想通过字段而不是通过主键来关联实体,你可以使用theta-join。例如:



SELECT t FROM Topic t, Forum f WHERE t.postCount = f.forumPostCount 这条查询语句返回的是与论坛回复(Forum)数相同的主题(Topic)。theta-join允许你关联那些没有显式关联关系或者关联到没有关系但是等同的信息的实体。


INNER JOIN
JPQL中inner join也是用于关系联合。其语法如下:



[INNER] JOIN join_association_path_expression [AS] identification_variable INNER和AS都是可选的。虽然它们对查询没有什么影响,你还是可以使用它们来更加清晰的表达你的意图。

join_assocation_path_expression的意思是你可以访问一个关联实体,不管是单值关联还是一个集合。下图演示了两个inner join查询:


图 3.


因为你不能在SELECT语句中使用一个集合关联字段,JPQL为你提供了INNER JOIN操作符。如果你想访问Forum-Topic-Post的关联关系(如图2所示),获得所有Post的标题,你可以使用这样一条查询语句:



SELECT p.title FROM Forum f JOIN f.topics AS t JOIN t.posts AS p 这条查询会返回0个或多个String对象,封装的是Forum-Topic-Post联合查询的回复的标题。


LEFT OUTER JOIN
一个outer join会返回一个实体的所有实例和其它与join criteria匹配的其它实体的实例。一个left join的语法如下:



LEFT [OUTER] JOIN join_association_path_expression [AS] identification_variable [OUTER]是可选的,因为在JPQL中LEFT JOIN和LEFT OUTER JOIN以认为是等同的。使用上图中所示的Forum/Post实体关系,下面的left join操作可以读取所有的Forum和任何与Forum关联的Topic。如果找不到1
Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值