【问题标题】:JPA entity graph: which join types?JPA 实体图:哪些连接类型?
【发布时间】:2017-11-24 05:41:54
【问题描述】:

JPA 实体图:例如

订单 - OrderItem - 产品

@NamedEntityGraph(name = "order", 
   attributeNodes = @NamedAttributeNode(value = "orderItems", subgraph = "orderItems"), 
   subgraphs = @NamedSubgraph(name = "orderItems", attributeNodes = @NamedAttributeNode("product")))

为什么order -> orderItems and orderItem -> product 没有joinType?实体图中的所有连接都应该是左连接?

【问题讨论】:

    标签: jpa left-join entitygraph


    【解决方案1】:

    EntityGraph 的目的是定义要包含在结果图中的内容。

    这不会影响连接类型。因此,您的依赖项的加载方式与在没有 EntityGraph 的情况下加载它们的方式相同。

    【讨论】:

    • CriteriaQuery 可以指定连接类型。但是对于带有 entityGraph 的 find() 方法,并使用一个带有连接的 SQL 来加载 entityGraph 中的所有实体,需要连接类型。在这种情况下无法指定连接类型。
    【解决方案2】:

    在创建联接时,必须在 JPQL 查询或条件查询中指定联接类型。

    例如下面的查询将导致三个表之间的内连接。

    select o from Order o join fetch o.orderItems items join fetch items.product p
    

    下面的查询将导致三个表之间的左外连接 :

    select o from Order o left join  o.orderItems items left join  items.product p
    

    但是如果你直接执行上面的查询,hibernate 将返回所有三个表的交叉连接。

    **因此要获得复古拟合(正确初始化所有关系)实体,您必须将实体图作为提示传递给查询。实体图不会更改您在查询或条件查询中指定的连接类型。它只会指示hibernate急切地获取关系并将它们正确地重新安装在实体中。 **

    检查我的 github 链接: https://github.com/vaneetkataria/Jpa-Hibernate/blob/master/jdbcToJpaMigration/src/test/java/com/katariasoft/technologies/jpaHibernate/entity/fetch/joinfetch/JPQLEntityGraphsJoinFetchTests.java

    【讨论】:

      猜你喜欢
      • 2014-03-13
      • 2014-09-30
      • 2017-04-04
      • 1970-01-01
      • 2023-02-24
      • 2018-11-13
      • 2019-10-28
      • 2018-02-09
      相关资源
      最近更新 更多