SELECT DISTINCT o
FROM Order o JOIN o.lineItems l JOIN l.product p
WHERE p.productType = 'office_supplies'
JOIN子句不再需要ON条件部分了,因为对象之间已经定义了关联关系
2. Collection Member Declarations
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->
SELECT DISTINCT o
FROM Order o, IN(o.lineItems) l
WHERE l.product.productType = 'office_supplies'
与1中的语句是等效的
FROM子句中为Order实体定义了别名o(Identification Variables);o.lineItems是集合类型的属性,IN(o.lineItems) l 的语义是:Order实例对象的lineItems中必须有符合后续条件的,l则代表lineItems中的每个对象;WHERE子句进一步声明了对l的过滤条件
JPA中把l.product这种表达式叫做path expression(An identification variable followed by the navigation operator (.) and a state-field or association-field is a path expression)
path express中每个点号后面的内容,有三种类型:persistent field、single-valued relationship field、collection-valued relationship field。如果是collection-valued relationship field则只能在
特定的场景下使用
例如上面1、2例子中,如果lineItems不是集合类型,则这2个例子的语句都等效于下面的写法(lineItems属性改名为lineItem以区别于集合这个概念):
3.
SELECT DISTINCT o
FROM Order o
WHERE o.lineItem.product.productType = 'office_supplies'
对path expression中的关联关系,JPA规定使用INNER JOIN操作,因此上面语句等效前面的示例1、2
但当lineItems为collection-valued relationship field时,上面写法不支持,必须采用1或2的写法
特定场景包括上面示例出来的JOIN子句、Collection Member Declarations这2种,还有Empty Collection Comparison Expressions、Collection Member Expressions中可以使用
4. Empty collection comparison expressions
SELECT o
FROM Order o
WHERE o.lineItems IS [NOT] EMPTY
5. Collection Member Expressions
SELECT o
FROM Order o
WHERE :lineItem MEMBER [OF] o.lineItems
6. ALL and ANY Expressions
SELECT emp
FROM Employee emp
WHERE emp.salary > ALL (
SELECT m.salary
FROM Manager m
WHERE m.department = emp.department)
ALL和ANY表达式用于子查询
上面的emp.salary>ALL(...),表示emp.salary必须大于子查询中返回的所有值;如果子查询没有符合条件的记录,则emp.salary>ALL(...)这个条件为true
将上面例子中的关键字ALL改为ANY(或者是SOME)关键字,则表示emp.salary只要大于子查询中返回的部分值就符合条件;如果子查询没有符合条件的记录,则emp.salary>ANY(...)这个条件为false;如果子查询返回的结果全部都大于或等于emp.salary,则这个条件为false
7. Constructor Expressions
使用constructor expressions可以指定使用特定的构造函数返回实例对象列表,而不是object数组的列表
SELECT NEW com.xyz.CustomerDetail(c.name, c.country.name)
FROM customer c
WHERE c.lastname = 'Coss' AND c.firstname = 'Roxane'
8. 再来几个示例
Find all orders that have line items:
SELECT DISTINCT o
FROM Order o, IN(o.lineItems) l
或者:
SELECT o
FROM Order o
WHERE o.lineItems IS NOT EMPTY
Find all orders that have no line items:
SELECT o
FROM Order o
WHERE o.lineItems IS EMPTY
通过上面这些例子可以看出JPA的查询语言具备较强的对象表达能力
UPDATE、DELETE语句的主要目的是提供bulk update、delete操作
JPA中也声明了一些函数,大部分为SQL标准中的一些基本函数
实现JPA规范的查询语言时,需要重点处理的一个方面是多态查询,语句中的实体类名有可能是abstract的或者supperclass,查询解析器需要能够处理这种多态查询。例如NHibernate(目前版本不知是否改成了Antlr来解析)在分析查询语句时比较简化处理,每遇到实体类都搜索是否有子类存在,如果有则会为每个子类生成一个查询语句,使用JOIN、UNION或者单独执行每个语句再将结果合并(NHibernate不支持Union Subclass),只实现了部分多态能力。要实现完全的多态能力,面对的情况以及需要处理的东西都比较复杂
其它一些细节方面的东西也非常多,例如persistence context可能缓存了一些更新操作,等待Flush时回写数据库,但为了保证查询结果的一致性,执行查询前至少需要先将persistence context中相关实体的更新缓存运用到数据库中
Metadata详细的元数据声明规范,查阅JPA对annotation、XML descriptor的说明一节
相关推荐
#### 二、JPA 规范1.0主要内容解读 ##### 2.1 规范背景 - **JSR 220**:JPA 规范是 JSR 220(Java Specification Request)的一部分,即 Enterprise JavaBeans (EJB) 3.0 规范。 - **开发团队**:由 Sun ...
标题:“JPA规范实现与总结” 描述:“JPA规范实现,用JPA来解决可移植问题” 本篇文章将深入探讨Java Persistence API(JPA)的规范实现及其在解决跨平台可移植性问题上的优势。JPA作为Java企业级应用中用于对象...
总之,JPA的主要jar文件是开发基于JPA应用不可或缺的组件,它们提供了JPA规范的实现和与数据库交互的必要工具。了解和掌握这些jar文件的作用以及如何正确配置它们,对于有效地使用JPA进行数据持久化至关重要。
JPA 1.0是这个规范的第一个主要版本,它为开发者提供了一种统一的、声明式的方式来处理数据持久化,从而简化了企业级应用的开发过程。JPA的核心理念是对象关系映射(ORM),它允许开发者用面向对象的方式思考,而...
JPA规范的主要作用是将Java对象映射到关系数据库表中,并提供了一组API来对这些对象执行CRUD(创建、读取、更新、删除)操作。JPA的目的是让开发者能够更简单地编写与数据库交互的代码,同时减少数据库操作的复杂性...
Java persistence api, jpa 2.0最终版使用规范, 资源是压缩包, 下载后解压缩文件,然后重命名persistence-2_0-final-spec文件,添加后缀 .pdf 原始文件的类型时pdf的
以上就是Hibernate4中关于JPA规范配置的详细介绍,包括了 `@Table`、`@SecondaryTable`、`@SecondaryTables`、`@UniqueConstraint`、`@Column` 和 `@JoinColumn` 等注解的主要用途和示例代码。通过对这些注解的理解...
在SSH2中集成JPA,可以充分利用JPA的注解规范,简化数据库操作。JPA通过注解可以在实体类上定义数据库表结构,如@Table表示实体类映射的数据库表,@Id表示主键,@GeneratedValue用于自动生成主键值等。此外,JPA还...
**JPA规范**定义了应用程序与数据库交互的一组接口和API,包括实体(Entities)、实体管理器(EntityManager)、查询语言(JPQL)和 Criteria API 等核心概念。通过使用JPA,开发者可以将业务对象与数据库表进行映射...
在本主题中,我们将深入探讨如何基于JPA规范来实现Hibernate依赖的jar包,以及这些jar包在Java项目中的作用。 首先,了解JPA的基本概念非常重要。JPA允许开发人员使用面向对象的编程模型来处理数据库操作,而无需...
以及在口头或书面交流中摘录规范的部分内容,只要这些摘录不构成规范的重要组成部分。 - **合规实施的许可**:允许用户根据适用的版权或专利权利永久、非独占、不可转让、全球性地创建和/或分发符合规范的独立实现...
TOPLink JPA提供了完整的JPA规范支持,包括实体管理、查询语言(JPQL)以及事务处理。TOPLink JPA的优势在于其高性能和对复杂数据模型的良好支持,同时也能够无缝集成到EclipseLink(Oracle的开源持久化框架)中,...
本书由JPA规范的主要领导者Linda DeMichiel作序,确保了其内容的权威性和准确性。 ### JPA2的关键特性 1. **实体管理器(EntityManager)**:这是JPA的核心接口,负责所有与实体类相关的操作,如持久化、删除、...
JPA规范的注解主要集中在`javax.persistence`包中,这些注解用于标注实体类、属性、关系等,使得ORM(对象关系映射)过程更加便捷。 在`javax.persistence`包中,有几个核心的注解,包括但不限于: 1. `@Entity`:...
在Java开发中,持久化层通常是通过JPA(Java Persistence API)来实现的,JPA规范定义了对象-关系映射(ORM)的框架,从而使得Java对象可以被存储到关系型数据库中。 在了解Gemini JPA之前,有必要先了解一下JPA...
当与JPA结合时,Hibernate作为持久化提供者,实现了JPA规范,从而为开发者提供了标准的接口和API。 **JPA和Hibernate的关系**: - JPA是规范,定义了ORM的标准,由Java EE(现在称为Jakarta EE)维护。 - Hibernate...
Hibernate是一个基于JPA规范的ORM(Object-Relational Mapping)框架,它提供了对数据库的访问和操作功能。Hibernate可以将Java对象转换为对应的数据库表记录,从而实现了数据的持久化。 四、Hibernate.cfg.xml文件...