`
liwy2008
  • 浏览: 28302 次
  • 性别: Icon_minigender_2
  • 来自: 海口
社区版块
存档分类
最新评论

jpa查询语言2

    博客分类:
  • jpa
阅读更多
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查询语言详解** Java Persistence API(JPA)是一种标准的Java库,用于管理和持久化Java对象到关系数据库。JPA提供了强大的查询语言——Java Persistence Query Language(JPQL),它允许开发者通过面向对象的...

    jpa查询语言.pdf

    **JPA查询语言(JPQL)**是Java Persistence API中的一个核心特性,它提供了一种面向对象的查询语言,用于在Java应用程序中检索和操作持久化实体。JPQL类似于SQL,但设计的目标是与对象模型更紧密地集成,而不是直接...

    jpa查询详解

    jpa查询详解 JPA(Java Persistence API)是一种 Java 持久层 API,用于处理 Java 对象和关系数据库之间的 Mapping。JPA 查询是 JPA 中的一种重要机制,用于从数据库中检索数据。在本文中,我们将详细介绍 JPA 查询...

    jpa例子jpajpa

    JPQL是一种面向对象的查询语言,类似SQL,但操作的是实体而不是数据库表。Criteria API则提供了一个更强大且类型安全的查询构建方式。 5. **事务管理(Transaction)**: 在JPA中,事务是通过`EntityManager`进行...

    Pro JPA2 精通JPA2

    2. **查询语言(JPQL)**:Java Persistence Query Language,一种类似于SQL的语言,用于在JPA中执行查询操作。JPQL支持面向对象的语法,使得开发者能够用更自然的方式表达查询逻辑。 3. **元数据注解**:JPA使用...

    Pro JPA 2版

    JPA通过JPQL(Java Persistence Query Language)提供了一种面向对象的查询语言,使得开发者可以使用类似SQL的语法查询实体,而无需关心底层数据库的具体实现细节。 4. 准则API(Criteria API) 第九章“Criteria ...

    学习hibernate必读,JPA2新特征和JPA2映射的神秘之旅。

    - **查询语言JPA QL的扩展**:包括集合函数、子查询、构造函数表达式等。 - **Criteria API的增强**:提供了更强大的动态查询构建能力,无需硬编码SQL语句。 2. **JPA2映射**: - **基本类型映射**:如`@Basic`...

    JPA源文件/jpa学习

    **JPA规范**定义了应用程序与数据库交互的一组接口和API,包括实体(Entities)、实体管理器(EntityManager)、查询语言(JPQL)和 Criteria API 等核心概念。通过使用JPA,开发者可以将业务对象与数据库表进行映射...

    JPA大全之经典全集

    JPA的官方文档详细介绍了JPA的规范和实现,包括其核心概念、配置、实体管理、查询语言、事务管理以及性能优化等方面。文档通常分为两部分:JSR(Java Specification Requests)文档和API文档。JSR文档定义了JPA的...

    JPA标记语言所需要的jar包

    6. **JPA Query Language (JPQL)**:JPA提供了一种面向对象的查询语言,类似于SQL,但更关注于对象而非表格。JPQL允许开发者用Java类和属性来编写查询,而不是直接使用数据库表和列。 7. **Criteria API**:除了...

    JPA教程,包括TOPLink JPA,Hibernate JPA,Open Jpa,jpa批注

    TOPLink JPA提供了完整的JPA规范支持,包括实体管理、查询语言(JPQL)以及事务处理。TOPLink JPA的优势在于其高性能和对复杂数据模型的良好支持,同时也能够无缝集成到EclipseLink(Oracle的开源持久化框架)中,...

    Spring Data JPA中文文档[1.4.3]_springdatajpa_erlang_waitxpf_

    9. **JPA Querydsl Support**:Spring Data JPA 还支持 Querydsl,这是一个强大的类型安全的查询语言,它可以进一步提高查询的可读性和可维护性。 10. **Elasticsearch 集成**:虽然不是 Spring Data JPA 的核心...

    JPA Demo 简单的了解下jpa

    **JPA查询语言(JPQL)** JPA提供了自己的查询语言——Java Persistence Query Language(JPQL),类似于SQL,但更面向对象。例如,以下JPQL查询返回所有用户: ```java String query = "SELECT u FROM User u"; ...

    springboot2+jpa+mysql

    5. **查询语言(JPQL)**:类似SQL的查询语言,用于在Java代码中执行复杂的数据库查询。 【MySQL】 MySQL是一款开源的关系型数据库管理系统,广泛应用于Web应用。它的特点包括: 1. **高性能**:采用ACID事务模型...

    jpa

    JPA的核心组件包括实体(Entity)、实体管理器(EntityManager)、实体管理工厂(EntityManagerFactory)和查询语言(JPQL)。实体是JPA中的核心概念,它是Java类,代表数据库中的表或视图。实体管理器负责与数据库...

    一个基于原生Java代码查询方式的JPA查询框架.zip

    标题“一个基于原生Java代码查询方式的JPA查询框架.zip”指的是一个使用Java Persistence API(JPA)的查询框架,该框架允许开发者使用原生的Java代码进行数据库查询,而不是依赖于HQL(Hibernate Query Language)...

    Open JPA2 employee 简单例子

    OpenJPA2还提供了查询语言JPA QL(Java Persistence Query Language),可以用来执行更复杂的查询。此外,OpenJPA2支持懒加载、级联操作、缓存策略等高级特性,这些在实际项目中都是很实用的功能。 通过这个简单的...

    JPA学习中文文档

    JPA包括以下3方面的技术: RM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元...查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

Global site tag (gtag.js) - Google Analytics