al">Topic,Object数组的第2项的值就是null。
SELECT f, t FROM Forum f LEFT JOIN f.topics t 使用范例数据库,上面的查询会返回以下结果:
[ Object: [Forum] Object: [Topic] ][ Object: [Forum] Object: [null] ][ Object: [Forum] Object: [null] ][ Object: [Forum] Object: [null] ][ Object: [Forum] Object: [null] ] 这个查询返回了所有的Forum实例和一个唯一的Topic,因为仅有一个Forum有一个Topic(看起来留言板需要更多的用户参与)。
由于LEFT JOIN操作符是预读取的一种有效方式,JPA还提供了FETCH JOIN操作。FETCH JOIN操作符在下一节介绍。
FETCH JOIN
fetch join允许你创建查询来预读取另外一种lazy关联关系。如果你了解到在所有的实体读取之后并可能处于脱管状态时就有必要使用LAZY关联关系,你就可以使用FETCH JOIN来读取这种关系。FETCH JOIN如下:
[LEFT [OUTER] INNER] JOIN FETCH join_association_path_expression和前面定义不同的是,FETCH JOIN没有范围变量,因为你不能在查询语句中使用隐式引用的实体。下面的查询会读取任何有主题(Topic)的论坛(Forum)实体,仅仅那有主题(Topic)的论坛(Forum)实体才会被读取。下面代码演示了如何定义论坛(Forum)实体。注意与主题(Topic)的关联关系是lazy。
@Entitypublic class Forum extends ModelBase implements Serializable { @OneToMany( fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE}, mappedBy="forum") @OrderBy("type asc, dateUpdated desc") Set<Topic> topics = new HashSet<Topic>(); // ...} 这里有一条查询语句:
SELECT DISTINCT f FROM Forum f JOIN FETCH f.topics 因为数据库中有5个Forum实例,但仅有一个有Topic。上面的查询语句会返回一个Forum实例,Topic的关联关系也立即读取。如果你不使用DISTINCT,持久化实现方案(persistence provider)会为系统中每个返回一个Forum实例。使用了DISTINCT,重复的实例会被删除。
要读取所有的论坛(Forum)实例,并立即读取它们的主题(Topic),如下在的查询语句所示,
SELECT DISTINCT f FROM Forum f LEFT JOIN FETCH f.topics 这条返回所有唯一的论坛(Forum)实例,并且所有的主题(topics)已经预先读取了。使用JOIN FETCH的一个缺点是需要知道对象模型。一旦你知道关联关系的类型,就可以用JOIN FETCH优化你的查询。
查询中的WHERE语句是由条件表达式组成,由它决定返回的实体。只要你将使用GROUP BY的字段放到SELECT语句中,你可以用GROUP BY来统计查询结果。你还可以用HAVING过滤查询结果。JPA并没有要求持久化实现在不使用GROUP BY支持HAVING,可以保持可移植性,你最好不要在GROUP BY外使用HAVING。
图 4. Post/User对象关系图
现在假设你想知道创建的agoraBB系统中每个用户的发帖数量。从上图中可以看,没有从User到Post的关联关系。因为User和Post继承ModelBase MappedSuperclass的,我们知道每个Post对象有一个createdByUser和updatedByUser字段。
使用inner join的话,你可以写查询语句:
SELECT count(p) From Post p JOIN p.createdByUser u 问题是,这条查询会返回所有的由createdByUser字段指定用户创建的所有帖子的数量。如果你想知道每个用户创建了多少帖子,你必须使用GROUP BY操作符:
SELECT u, count(p) From Post p JOIN p.createdByUser u GROUP BY uWHERE , GROUP BY , HAVING这条查询语句会返回一个User实例和他所创建帖子的数量。为了进一步缩小结果范围,你可以使用HAVING过滤分组信息(由GROUP BY标志)。下面的查询会返回User实例及他所发的帖子数量,前提是用户的密码是8个以上的字符。 SELECT u, count(p) From Post p JOIN p.createdByUser u GROUP BY u HAVING length(u.password) > 8 条件表达式(CONDITIONAL EXPRESSIONS)条件表达式可以用在一个JPQL查询的WHERE和HAVING语句中。你必须了解使用条件表达式时的一些约束。 条件表达式中包括LOB状态字段可能无法在数据库之间进行移植。 字符串使用单引号字符串包裹,如'this'。如果要在查询中使用单引号,就要两个一起使用。你无法在查询中使用Java转义方法(例如,\'代表单引号)。布尔(Boolean)字符用TRUE和FALSE表示(不区分大小写),数字字符遵从Java规范,不支持日期字符串。同样可以支持Enum,但是你必须使用Enum,全路径名称,如,com.sourcebeat.jpa.model.FTPType。 标识变量必须出现在一个SELECT或DELETE查询的FROM语句中。如果使用UPDATE,那么标识变量就必须在UPDATE语句中。标识变量往往表示他们所定义的实体类型,而不能表示一个集合中的实体。 你可以使用位置或者命名形式的输入参数,但不能在某一查询混合使用这两种形式。输入参数可以出现一个查询的WHERE语句和(或者)HAVING语句中。 位置形式参数的格式是以一个问号(?)打头紧跟一个以1开始的正整数。例如,?1。你可以在一个查询中多个使用同一位置参数,如下所示。 SELECT u FROM User u WHERE u.dateCreated = ?1 OR u.dateUpdated = ?1 命名形式的参数用一个冒号(:)加一个Java标志符如Java变量名来表示。命名参数表示如下: SELECT u FROM User u WHERE u.dateCreated = :aDate OR u.dateUpdated = :aDate 函数与表达式(FUNCTIONS AND EXPRESSIONS)JPQL支持函数功能,多种的IN,LIKE和BETWEEN样式表达式,及面向集合(collection)的条件表达式。这一节详细讨论写查询可用的各种选择。一个查询语句中操作符的优先级为: 导航操作符(.) 一元符号(+,-) 乘(*),除(/) 加(+),减(-) 比较操作符,=, >, >=, <, <=,<> (不等), [NOT] BETWEEN, [NOT] LIKE, [NOT] IN, IS [NOT] NULL, IS [NOT] EMPTY, [NOT] MEMBER [OF] 逻辑操作符,NOT, AND, OR BETWEEN你可以用BETWEEN操作符指定一个实体字段的范围。BETWEEN的语法是: expression [NOT] BETWEEN expression AND expression 这里expression可以是一个字符串,算术或日期时间表达式。这里有几个使用BETWEEN操作符的实例。 SELECT u FROM User u WHERE u.dateCreated between :startDate AND :endDateSELECT t FROM Topic t WHERE t.postCount NOT BETWEEN ?1 AND ?2 IN你可以利用IN比较操
分享到:
相关推荐
**JPA查询语言详解** Java Persistence API(JPA)是一种标准的Java库,用于管理和持久化Java对象到关系数据库。JPA提供了强大的查询语言——Java Persistence Query Language(JPQL),它允许开发者通过面向对象的...
**JPA查询语言(JPQL)**是Java Persistence API中的一个核心特性,它提供了一种面向对象的查询语言,用于在Java应用程序中检索和操作持久化实体。JPQL类似于SQL,但设计的目标是与对象模型更紧密地集成,而不是直接...
jpa查询详解 JPA(Java Persistence API)是一种 Java 持久层 API,用于处理 Java 对象和关系数据库之间的 Mapping。JPA 查询是 JPA 中的一种重要机制,用于从数据库中检索数据。在本文中,我们将详细介绍 JPA 查询...
JPQL是一种面向对象的查询语言,类似SQL,但操作的是实体而不是数据库表。Criteria API则提供了一个更强大且类型安全的查询构建方式。 5. **事务管理(Transaction)**: 在JPA中,事务是通过`EntityManager`进行...
**JPA规范**定义了应用程序与数据库交互的一组接口和API,包括实体(Entities)、实体管理器(EntityManager)、查询语言(JPQL)和 Criteria API 等核心概念。通过使用JPA,开发者可以将业务对象与数据库表进行映射...
JPA的官方文档详细介绍了JPA的规范和实现,包括其核心概念、配置、实体管理、查询语言、事务管理以及性能优化等方面。文档通常分为两部分:JSR(Java Specification Requests)文档和API文档。JSR文档定义了JPA的...
`EntityManager`提供了管理实体对象的生命周期方法,如`persist()`, `merge()`, `remove()`, `find()`等,以及事务管理、查询语言(JPQL)执行等功能。`EntityManager`的实例是轻量级的,可以在需要时创建和关闭,但...
6. **JPA Query Language (JPQL)**:JPA提供了一种面向对象的查询语言,类似于SQL,但更关注于对象而非表格。JPQL允许开发者用Java类和属性来编写查询,而不是直接使用数据库表和列。 7. **Criteria API**:除了...
TOPLink JPA提供了完整的JPA规范支持,包括实体管理、查询语言(JPQL)以及事务处理。TOPLink JPA的优势在于其高性能和对复杂数据模型的良好支持,同时也能够无缝集成到EclipseLink(Oracle的开源持久化框架)中,...
**JPA查询语言(JPQL)** JPA提供了自己的查询语言——Java Persistence Query Language(JPQL),类似于SQL,但更面向对象。例如,以下JPQL查询返回所有用户: ```java String query = "SELECT u FROM User u"; ...
JPA包括以下3方面的技术: RM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元...查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
2. **查询语言(JPQL)**:Java Persistence Query Language,一种类似于SQL的语言,用于在JPA中执行查询操作。JPQL支持面向对象的语法,使得开发者能够用更自然的方式表达查询逻辑。 3. **元数据注解**:JPA使用...
9. **JPA Querydsl Support**:Spring Data JPA 还支持 Querydsl,这是一个强大的类型安全的查询语言,它可以进一步提高查询的可读性和可维护性。 10. **Elasticsearch 集成**:虽然不是 Spring Data JPA 的核心...
标题“一个基于原生Java代码查询方式的JPA查询框架.zip”指的是一个使用Java Persistence API(JPA)的查询框架,该框架允许开发者使用原生的Java代码进行数据库查询,而不是依赖于HQL(Hibernate Query Language)...
JPA的核心组件包括实体(Entity)、实体管理器(EntityManager)、实体管理工厂(EntityManagerFactory)和查询语言(JPQL)。实体是JPA中的核心概念,它是Java类,代表数据库中的表或视图。实体管理器负责与数据库...
此外,JPA还包括一个功能强大的查询语言,即JPQL(Java Persistence Query Language)。 2. 在Eclipse RCP中使用JPA时,通常需要处理应用的生命周期和依赖性管理。OSGi环境中的每个模块被称为一个“Bundle”,每个...
标题中提到的"JPA中文解释"是指对于JPA的概念、原理、使用方法等进行了中文语言的详细解读,这对于中文环境下的开发者来说非常方便,能够更好地理解和应用JPA。JPA的核心理念是对象关系映射(ORM),它将Java对象...
**JPA查询语言**,即JPQL(Java Persistence Query Language),是JPA提供的一个面向对象的查询语言,类似于SQL,但更加面向对象。JPQL用于从数据库检索或更新实体,支持复杂的查询结构,如选择、聚合、连接、子查询...