今天同事碰到一个JPA Query 的问题, 在业务上我们有4个entity
CustomerSetType
一对多个 CustomerSet
CustomerSet
多对一 CustomerSetType, 多对一 master CustomerSet, 一对多 Customer
Customer
一对多 Client
Client
由于业务性质就不具体贴出代码, 基本的实体间关系就如上述所说。 我们使用的是ElipseLink 的 JPA 实现. 在配置多对一, 一对多的 FetchType 都是默认的设置。 也就是说多对一默认的fetchType 是 Eager, 一对多的是Lazy。
现在有一个NameQuery : select cs from CustomerSet cs where cs.customerType.code = 'ABC'
写一个简单的unit test 跑跑, 从log 看到EclipseLink 大约用了 700 多个 query。 汗一个, 难怪客户不爽, 要求改进。
改进的思路是使用 JPA query 的Hint , 只改query的配置, 保持代码annotation的配置不变还是默认方式。 这样基本上以前的代码就不需要改动。
具体的进行过程中碰到的问题:
1, 好像EclipseLink 在 NamedQuery 中 采用标准的JPA lint 名字 , 比如
<hint name="LEFT_FETCH" value="cs.customerSetType"></hint>
从log 的结果来看没有具体效果
2, 只好到EclipseLink 官方网站 找线索, 突然想起上次做查询 需要 Cursor 的时候用Hint 的时候 也碰到一个问题 标准的JPA hint name 它就是不支持。 根据这个提示找到 一个 hint name : eclipselink.left-join-fetch, 为什么要用到 left join 呢? 因为这个CustomerSet 下面可能是还没有关联上 Customer , 同理 Customer 还没有关联上 Client 的。 CustoomerSet,Customer 到Client 有3级, 我们只需要配置 fetch join 到 cs.customerlist.clientlist , 从输出的sql 可以看到有两个 left join , 一个是 customer set left join customer, 一个是 left join client。 再看sql 已经减少到 几十个。为什么还还有这么多呢? 在customer set 实体上一个有 3个一对多的关系, 我们现在只处理掉一个, 还有两个呢, 它到 customer set type, 它自身join 的 master customer set。 如法炮制, 但是它们俩就不需要 left join 了, eclipselink.join-fetch 搞定。
再来看输出的sql 只有 4个了, 主要是因为它自己的级联出来的 master customer set 需要再去搞定 type name 啥的, 基本上没有办法再精简了。
回头想想, 如果现在的OR Mapping 能做到这个效果,效率不比我们自己native sql 出来再拼装 对象的方式差吧。 做个记号,要去down 个 EclipseLink 的代码来看看它的实现补补课了。
分享到:
相关推荐
EclipseLink是一个强大的Java持久化框架,它是Java Persistence API (JPA)的官方推荐实现之一。JPA是一种标准的API,用于在Java应用程序中管理和访问关系数据库,它为开发人员提供了一种对象/关系映射(ORM)工具,...
EclipseLink是一个强大的Java持久化框架,它是Java Persistence API (JPA) 的一个实现,用于管理应用程序中的对象-关系映射(ORM)。本教程将深入探讨如何使用EclipseLink进行CRUD(创建、读取、更新和删除)操作,...
选择 JPA 选项,并添加 EclipseLink 作为 JPA 实现库,指定必要的 JAR 包。 **总结** JPA 通过提供一套标准的 ORM 解决方案,简化了 Java 应用与数据库的交互,使得开发者能够更高效地进行开发。EclipseLink 作为 ...
EclipseLink项目也是Gemini OSGi JPA服务实现的基础。 在OSGi环境中,一个典型的JPA应用涉及到的步骤可能包括: - 应用逻辑的创建和修改。 - 实体类的创建或修改。 - 持久化描述符的声明,这通常通过在OSGi环境下...
例如:EclipseLink的query.setHint(QueryHints.RESULT_TYPE, ResultType.Map);Hibernate的.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)。 因此,如果我们想要返回Map并且确定底层用的是某一种JPA的...
Spring Boot 提供了对 JPA(Java Persistence API)的无缝支持,使得开发者可以轻松地使用 ORM(Object-Relational Mapping)框架,如 Hibernate 或 EclipseLink,来处理数据库操作。通过在 `pom.xml` 或 `build....
这提高了代码的可读性和可维护性,并且由于JPA是标准的,切换到其他JPA实现(如EclipseLink)也相对容易。 总之,基于JPA规范实现的Hibernate依赖jar包是Java企业级应用开发的重要组成部分。它简化了ORM过程,促进...
TOPLink JPA的优势在于其高性能和对复杂数据模型的良好支持,同时也能够无缝集成到EclipseLink(Oracle的开源持久化框架)中,提供了广泛的持久化服务。 **2. Hibernate JPA** Hibernate是最早的ORM框架之一,后来...
使用JPA进行数据操作时,我们需要一个实现`EntityManagerFactory`的提供商,如Hibernate或EclipseLink。`EntityManager`是JPA的核心接口,用于持久化操作,如查询、创建、更新和删除实体。 查询可以通过原生的JPA ...
它支持多种持久化技术,包括 Hibernate、EclipseLink 等 JPA 实现。 二、核心概念 1. **Repository**:Repository 是 Spring Data JPA 的核心接口,它定义了基本的 CRUD(创建、读取、更新、删除)操作。通过继承...
Java Persistence API (JPA) 是Java企业版5(Java ...Oracle TopLink(现为EclipseLink)提供了对JPA 1.0规范以及许多扩展的支持,包括以前称为TopLink JPA的功能。更多信息和详细文档,可以访问EclipseLink官网获取。
在实际项目中,使用JPA通常会结合一个实现JPA规范的持久层框架,比如Hibernate、EclipseLink等。这些实现提供了更多的功能和优化,如缓存机制、性能调优等。 关于【标签】"源码",这可能意味着讨论的是JPA的实现...
- **EclipseLink**: 另一个开源的JPA实现,由Oracle公司维护,同样广泛使用。 4. **JAR包内容** 压缩包中的JAR文件可能包含了以下部分: - **JPA规范**: 实现JPA功能的基础API,如javax.persistence.*包下的类和...
同时,JPA的移植性较好,可以在不同的持久化提供者之间切换,如Hibernate、EclipseLink等,这为项目扩展提供了灵活性。 总之,"JPA大全之经典全集"这个资源集合对于学习和掌握JPA有着重要的价值,无论是初学者还是...
Spring JPA通过使用Hibernate或EclipseLink等JPA实现,进一步增强了其功能。 1. **Spring JPA操作数据库:** Spring JPA允许我们使用注解来定义实体类,这些类对应于数据库中的表。例如,`@Entity`表示这是一个...
Spring Data JPA遵循JPA规范,这意味着它可以与其他JPA提供商(如Hibernate、EclipseLink等)无缝集成。开发者可以选择最适合项目需求的JPA实现。 七、分页和排序 Spring Data JPA提供了PagingAndSortingRepository...
1. **配置JPA**:首先,工程中必须包含JPA的依赖库,如Hibernate或EclipseLink等实现,这些实现提供了JPA规范的具体功能。在Eclipse中,可以通过添加库或构建路径来引入这些依赖。 2. **实体类(Entity)**:JPA...
可以通过查看 JPA 提供者的源码,如 Hibernate 或 EclipseLink,了解它们如何实现 ORM 过程,包括对象关系映射、缓存策略、查询优化等。 ### 工具支持 许多 IDE,如 IntelliJ IDEA 和 Eclipse,提供了对 JPA 的...
此外,这个jar包可能还包含了像Hibernate或EclipseLink这样的JPA实现,它们是JPA规范的具体实现,提供了实际的数据持久化功能。 标签“JPA”进一步确认了这个jar包与Java持久化API的关联。JPA允许我们定义实体类,...
ORM框架如Hibernate、EclipseLink和JPA等,允许开发者以面向对象的方式处理数据,无需关心底层的SQL细节。 2. **JPA体系架构** - JPA提供了一种标准的API和元数据模型,用于定义Java对象如何映射到数据库表。这...