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
分享到:
相关推荐
jpa查询语言.pdf
JPA查询语言[归类].pdf
JPA包括以下3方面的技术: RM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元...查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
JPA 规范部分详细的介绍了 JPA 中实体 Bean 的定义,并介绍了实体 Bean 支持的注释、全新的查询语言、实体管理接口、容器实现规范等内容。 JPA 标准制定过程中充分吸收了目前已经出现的所有持久化技术的所有优点,...
可媲美JDBC的查询能力: JPA的查询语言是面向对象的,JPA定义了独特的JPQL,而且能够支持批量更新和修改、JOIN、GROUP BY、HAVING 等通常只有 SQL 才能够提供的高级查询特性,甚至还能够支持子查询。 支持面向对象...
JPA 的全称是 Java Persistence API, 即 Java 持久...JPA 的查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以 看成是 Hibernate HQL 的等价物。 本文档包含了JPA的课件笔记与学习标注。
每个批注的详细与使用 查询语言 教程等等
查询语言,用于使用现有数据完成这些查询。 GraphQL 为您的 API 中的数据提供了完整且易于理解的描述,让客户能够准确地询问他们需要什么,更容易随着时间的推移发展 API,并启用强大的开发人员工具。 您的应用程序...
JDBC支持处理大量的数据,能够保证数据的一致性,支持信息的并发访问,提供 SQL 查询语言查找数据。JDBC 所使用的关系模型不是为保存对象而设计的,因此迫使开发者选择在处理持久数据时放弃面向对象编程,或者自己去...
EJB 查询语言开发。其实关于JPA 还有一部分是基于EJB 容器环境 的开发,那一部分内容我们将会放到后面的EJB 开发一章来介绍。由于MyEclipse 6 对JPA 开发提供了很方便的支持,因此我们的内容主要就集中在如何使用...
查询语言查找数据。 JDBC 所使用的关系模型不是为保存对象而设计的, 因此迫使开发者选择在处理持久数据时 放弃面向对象编程, 或者自己去开发将面向对象特性(比如: 类之间的继承) 和关系型数据 库进行...
13.1.3.6 JPA 查询语言(JPA QL)简介...................... 19 13.1.3.7 回调方法 ....................................... 21 13.2 准备工作............................................ 22 13.3创建...
第二部分详细讲解了jsf ri、jta、jndi、rmi、jms、javamail、ejb 3的session bean、message driven bean、jpa、jax-ws 2、jaas等java ee知识,这部分知识以jsf+ejb 3+jpa整合开发为重点,通过使用netbeans ide工具...
Spring Data 是 Spring 的一个子...2:详解Spring Data JPA封装的各种查询方式 3:详解Spring Data JPA常用接口 4:详解Spring Data JPA各种查询方式 5:详解Spring Data JPA在web方面的用法 具体内容,可以参考大纲:
通过JPA重新控制SQL FluentJPA是一种用于关系(SQL)数据库和JPA的语言集成查询(LINQ)技术。 它允许您通过直接集成到语言中来使用Java编写强类型查询。FluentJPA如何集成到Java中? 乍一看,似乎我们需要Java...
本系统基本完成了一个基于spring boot + JPA的进销存管理系统,主要实现采购管理、库存管理、销售管理、查询统计、资料管理和系统管理功能。 本系统的实现依靠了很多计算机技术,包括Java语言、Spring boot框架、JPA...
蝙蝠在线考试系统基于JSF2、Spring3、JPA2等JAVA技术构建,系统使用MYSQL数据库,可以部署于WINDOWS、LINUX、UNIX等各种操作系统,内置了无处不在的AJAX能力,简洁易用,支持单选题、多选题、填空题、判断题、问答题...
编程语言:JDK1.8,HTML,CSS,JS,jQuery 数据库:mysql5.7以上 4.项目需求 题目描述 基于Spring Boot和Spring Data JPA设计一个简单的在线课程系统,需要实现以下功能: 1.课程的增删改查(CRUD),每门课程包括课程...
现采购管理、库存管理、销售管理、查询统计、资料管理和系统管理功能。 本系统的实现依靠了很多计算机技术,包括Java语言、Spring boot框架、 JPA持久层框架和MySQL数据库。带视频,带文档 运行环境:idea/...
一、预备知识JPA即JavaPersistenceAPI,它是是EJB3.0规范(JSR...1,简化程序模型2,使用注释,简化配置3,ORM:对象关系映射4,EJB-QL:提供了动态查询,和功能强大的EJB查询语言5,独立。可在EJB容器之外单独运行,也