`
bruce008
  • 浏览: 173385 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

EclipseLink 对JPA Query 实现的优化实现

    博客分类:
  • J2EE
 
阅读更多

今天同事碰到一个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-2.5.2.v20140319-9ad6abd.zip

    EclipseLink是一个强大的Java持久化框架,它是Java Persistence API (JPA)的官方推荐实现之一。JPA是一种标准的API,用于在Java应用程序中管理和访问关系数据库,它为开发人员提供了一种对象/关系映射(ORM)工具,...

    eclipselink的crud

    EclipseLink是一个强大的Java持久化框架,它是Java Persistence API (JPA) 的一个实现,用于管理应用程序中的对象-关系映射(ORM)。本教程将深入探讨如何使用EclipseLink进行CRUD(创建、读取、更新和删除)操作,...

    jpa-开发11

    选择 JPA 选项,并添加 EclipseLink 作为 JPA 实现库,指定必要的 JAR 包。 **总结** JPA 通过提供一套标准的 ORM 解决方案,简化了 Java 应用与数据库的交互,使得开发者能够更高效地进行开发。EclipseLink 作为 ...

    Gemini JPA 介绍资料

    EclipseLink项目也是Gemini OSGi JPA服务实现的基础。 在OSGi环境中,一个典型的JPA应用涉及到的步骤可能包括: - 应用逻辑的创建和修改。 - 实体类的创建或修改。 - 持久化描述符的声明,这通常通过在OSGi环境下...

    让JPA的Query查询接口返回Map对象的方法

    例如:EclipseLink的query.setHint(QueryHints.RESULT_TYPE, ResultType.Map);Hibernate的.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP)。 因此,如果我们想要返回Map并且确定底层用的是某一种JPA的...

    java springboot+jpa

    Spring Boot 提供了对 JPA(Java Persistence API)的无缝支持,使得开发者可以轻松地使用 ORM(Object-Relational Mapping)框架,如 Hibernate 或 EclipseLink,来处理数据库操作。通过在 `pom.xml` 或 `build....

    基于JPA规范实现hibernate依懒的jar包

    这提高了代码的可读性和可维护性,并且由于JPA是标准的,切换到其他JPA实现(如EclipseLink)也相对容易。 总之,基于JPA规范实现的Hibernate依赖jar包是Java企业级应用开发的重要组成部分。它简化了ORM过程,促进...

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

    TOPLink JPA的优势在于其高性能和对复杂数据模型的良好支持,同时也能够无缝集成到EclipseLink(Oracle的开源持久化框架)中,提供了广泛的持久化服务。 **2. Hibernate JPA** Hibernate是最早的ORM框架之一,后来...

    jpa入门范例

    使用JPA进行数据操作时,我们需要一个实现`EntityManagerFactory`的提供商,如Hibernate或EclipseLink。`EntityManager`是JPA的核心接口,用于持久化操作,如查询、创建、更新和删除实体。 查询可以通过原生的JPA ...

    spring-data-jpa-examples

    它支持多种持久化技术,包括 Hibernate、EclipseLink 等 JPA 实现。 二、核心概念 1. **Repository**:Repository 是 Spring Data JPA 的核心接口,它定义了基本的 CRUD(创建、读取、更新、删除)操作。通过继承...

    JPA 标注 JPA标签手册

    Java Persistence API (JPA) 是Java企业版5(Java ...Oracle TopLink(现为EclipseLink)提供了对JPA 1.0规范以及许多扩展的支持,包括以前称为TopLink JPA的功能。更多信息和详细文档,可以访问EclipseLink官网获取。

    jpa的工程

    在实际项目中,使用JPA通常会结合一个实现JPA规范的持久层框架,比如Hibernate、EclipseLink等。这些实现提供了更多的功能和优化,如缓存机制、性能调优等。 关于【标签】"源码",这可能意味着讨论的是JPA的实现...

    jpa需要的jar包

    - **EclipseLink**: 另一个开源的JPA实现,由Oracle公司维护,同样广泛使用。 4. **JAR包内容** 压缩包中的JAR文件可能包含了以下部分: - **JPA规范**: 实现JPA功能的基础API,如javax.persistence.*包下的类和...

    JPA大全之经典全集

    同时,JPA的移植性较好,可以在不同的持久化提供者之间切换,如Hibernate、EclipseLink等,这为项目扩展提供了灵活性。 总之,"JPA大全之经典全集"这个资源集合对于学习和掌握JPA有着重要的价值,无论是初学者还是...

    spring jpa操作数据库 级联数据 hibernate

    Spring JPA通过使用Hibernate或EclipseLink等JPA实现,进一步增强了其功能。 1. **Spring JPA操作数据库:** Spring JPA允许我们使用注解来定义实体类,这些类对应于数据库中的表。例如,`@Entity`表示这是一个...

    spring-data-JPA帮助文档

    Spring Data JPA遵循JPA规范,这意味着它可以与其他JPA提供商(如Hibernate、EclipseLink等)无缝集成。开发者可以选择最适合项目需求的JPA实现。 七、分页和排序 Spring Data JPA提供了PagingAndSortingRepository...

    jpa操作mysql数据库

    1. **配置JPA**:首先,工程中必须包含JPA的依赖库,如Hibernate或EclipseLink等实现,这些实现提供了JPA规范的具体功能。在Eclipse中,可以通过添加库或构建路径来引入这些依赖。 2. **实体类(Entity)**:JPA...

    JPA (一)

    可以通过查看 JPA 提供者的源码,如 Hibernate 或 EclipseLink,了解它们如何实现 ORM 过程,包括对象关系映射、缓存策略、查询优化等。 ### 工具支持 许多 IDE,如 IntelliJ IDEA 和 Eclipse,提供了对 JPA 的...

    JPA测试jar包

    此外,这个jar包可能还包含了像Hibernate或EclipseLink这样的JPA实现,它们是JPA规范的具体实现,提供了实际的数据持久化功能。 标签“JPA”进一步确认了这个jar包与Java持久化API的关联。JPA允许我们定义实体类,...

    JPA开发文档API

    ORM框架如Hibernate、EclipseLink和JPA等,允许开发者以面向对象的方式处理数据,无需关心底层的SQL细节。 2. **JPA体系架构** - JPA提供了一种标准的API和元数据模型,用于定义Java对象如何映射到数据库表。这...

Global site tag (gtag.js) - Google Analytics