摘要
本章探讨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,你会得到一个类型不相容的编译器错误。
例如,有下面这样一个查询语句:
SELECT u.username FROM User u在这个查询语句中,u.username一个表达式的结果是一个String类型。这个查询会返回一个String对象的list。list中的各个对象代表系统中一个不同的用户名。JPQL规范将一个实体(属性)中所饮食的各种类型称为抽象模型类型(abstract schema type)。
一个实体可以包含一个或多个下面的抽象模型类型:
状态字段(state-field):这种类型包括一个实体不代表关联关系的任何字段或属性。字段的类型或者一个属性get方法的返回结果决定了状态字段的抽象模型类型。
关联字段(association-field):这种类型包括了一个实体中任何表示关联关系的字段或属性。关联字段的抽象模型类型就是目标实体的抽象模型类型。
JPQL语句的作用范围是由你执行查询语句中持久化单元(persistence unit)的实体决定的。
在一个查询中,实体是通过实体名称来引用的。实体的名称就是你使用@Entity注释时指定的名称,或者是实体的限定词(unqualified name)。假如有这样一个实体。
package com.sourcebeat.jpa.model;@Entity(name="message")public class PrivateMessage extends ModelBase { // fields/methods removed for readability} 实体名称是“ message ”,因为你在使用@Entity时候指定了名称(在一个持久化单元内实体名称必须是唯一的)。在下面的代码中,实体的限定词是User(以一个大写的“U”开头)。实体的全名是com.sourcebeat.jpa.model.User,但它的限定词 是User。
package com.sourcebeat.jpa.model;@Entitypublic class User extends ModelBase { // fields/methods removed for readability} 当我们在JPQL中引用实体时,必须使用@Entity注释指定的名称或是实体的限定词 。一些JPA实现(如,Hibernate)允许你使用全名,但有的(如,Toplink)则抛出异常。为了保证移植性,在查询中最好使用限定词 。
一个标识变量(identification variable)是一个在FROM语句中指定的一个标志符号。在下面的查询语句中,u就是一个标识变量。u类型就是能够识别名称User的实体的抽象模型类型。在本例中,实体是User(前面已经定义),所以u的类型是User。
SELECT u FROM User u 标识变量也可以使用JOIN关键字定义,例如。
SELECT r.name FROM User u JOIN u.roles r 这里,标识变量有u和r。r表示任何能够从一个User实例中直接访问的Role。
保留标志符
JPA定义了以下保留标志符(虽然下面列表中显示是大写形式,保留标志符并不区分大小写,所以SELECT和select或SelECt等同。)
SELECT, FROM, WHERE, UPDATE, DELETE, JOIN, OUTER, I
分享到:
相关推荐
**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 查询...
### JPA查询语言 1. **JPQL**: 一种声明式语言,用于查询实体和它们之间的关系。例如:`SELECT e FROM Entity e WHERE e.name = 'example'`。 2. **Criteria API**: 动态构建查询的API,更易于代码的编译时检查和...
JPQL是一种面向对象的查询语言,类似SQL,但操作的是实体而不是数据库表。Criteria API则提供了一个更强大且类型安全的查询构建方式。 5. **事务管理(Transaction)**: 在JPA中,事务是通过`EntityManager`进行...
TOPLink JPA提供了完整的JPA规范支持,包括实体管理、查询语言(JPQL)以及事务处理。TOPLink JPA的优势在于其高性能和对复杂数据模型的良好支持,同时也能够无缝集成到EclipseLink(Oracle的开源持久化框架)中,...
**JPA规范**定义了应用程序与数据库交互的一组接口和API,包括实体(Entities)、实体管理器(EntityManager)、查询语言(JPQL)和 Criteria API 等核心概念。通过使用JPA,开发者可以将业务对象与数据库表进行映射...
JPA的官方文档详细介绍了JPA的规范和实现,包括其核心概念、配置、实体管理、查询语言、事务管理以及性能优化等方面。文档通常分为两部分:JSR(Java Specification Requests)文档和API文档。JSR文档定义了JPA的...
1. **Java Persistence API (javax.persistence.*)**:这是JPA规范的核心接口和API,定义了实体管理、查询语言以及事务管理等核心功能。它定义了Entity、EntityManager、EntityManagerFactory等关键类,这些类是进行...
**JPA查询语言(JPQL)** JPA提供了自己的查询语言——Java Persistence Query Language(JPQL),类似于SQL,但更面向对象。例如,以下JPQL查询返回所有用户: ```java String query = "SELECT u FROM User u"; ...
2. **查询语言(JPQL)**:Java Persistence Query Language,一种类似于SQL的语言,用于在JPA中执行查询操作。JPQL支持面向对象的语法,使得开发者能够用更自然的方式表达查询逻辑。 3. **元数据注解**:JPA使用...
9. **JPA Querydsl Support**:Spring Data JPA 还支持 Querydsl,这是一个强大的类型安全的查询语言,它可以进一步提高查询的可读性和可维护性。 10. **Elasticsearch 集成**:虽然不是 Spring Data JPA 的核心...
JPA的核心组件包括实体(Entity)、实体管理器(EntityManager)、实体管理工厂(EntityManagerFactory)和查询语言(JPQL)。实体是JPA中的核心概念,它是Java类,代表数据库中的表或视图。实体管理器负责与数据库...
1. **JPQL(Java Persistence Query Language)替代:** 通常JPA提供JPQL,一种面向对象的查询语言,类似于SQL,但专为ORM设计。原生Java查询则直接使用Java方法调用,返回结果集。 2. **Criteria API:** 这是JPA...
Hibernate不仅提供了JPA规范的所有功能,还额外提供了一些扩展特性,如第二级缓存、查询语言(HQL)和 Criteria API等。 在"JPA-1-HelloWorld"这个示例中,我们将看到如何使用Hibernate作为JPA的实现来完成一个简单的...
JPA包括以下3方面的技术: RM映射元数据,JPA支持XML和JDK 5.0注解两种元数据的形式,元...查询语言,这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。
3. **查询语言**:JPA引入了一种面向对象的查询语言,与传统的SQL查询相比,它更加自然,更贴近Java开发者的思维模式,减少了代码与数据库查询之间的耦合度。 #### 三、实体对象 实体是JPA中的核心概念,代表了要...
此外,JPA还包括一个功能强大的查询语言,即JPQL(Java Persistence Query Language)。 2. 在Eclipse RCP中使用JPA时,通常需要处理应用的生命周期和依赖性管理。OSGi环境中的每个模块被称为一个“Bundle”,每个...
标题中提到的"JPA中文解释"是指对于JPA的概念、原理、使用方法等进行了中文语言的详细解读,这对于中文环境下的开发者来说非常方便,能够更好地理解和应用JPA。JPA的核心理念是对象关系映射(ORM),它将Java对象...