【问题标题】:Hibernate/JPQL: How to load parent with all childs based on query on a childHibernate/JPQL:如何根据对子项的查询加载所有子项的父项
【发布时间】:2020-08-20 07:17:29
【问题描述】:

所以我们有一个简化了这两个实体的服务

@Entity
public class Ticket {
/* simplified*/

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "ticket", cascade = CascadeType.ALL, orphanRemoval = true)
  private Set<Grant> grants = new HashSet<>();
}

@Entity
public class Grant {
/* simplified*/

  @NotNull
  @ManyToOne(fetch = LAZY)
  @JoinColumn(name = UsageGrant.FK_TICKET, nullable = false)
  private Ticket ticket;

  @NotNull
  @Column(name = "specialNumber", nullable = false)
  private Integer specialNumber;
}

我想要一个查询来选择包含具有特定“specialNumber”的授权的所有票证。问题是我希望将所有授权的票返回,而不仅仅是一个匹配。我试过了

@Repository
public interface TicketRepository extends JpaRepository<Ticket, String> {

@Query("SELECT DISTINCT ti FROM Ticket ti JOIN FETCH ti.grants g WHERE 
g.specialNumber = :specialNumber "
  )
  List<Ticket> findBySpecialNumberAndLoadAllGrantsOnTicket(
      @NotNull @Param("specialNumber") Integer specialNumber);
}

但这给了我一个匹配的。我需要把它分成两个查询吗? Criteria API 也无济于事,因为那里也不支持 RIGHT JOIN。

更新

我可以实现它

SELECT g FROM Grant g LEFT JOIN FETCH g.ticket ti JOIN FETCH ti.grants WHERE g.specialNumber = :specialNumber

并使用 g.getTicket() 访问票证。结果查询看起来很疯狂,我不确定这是否是一个聪明的方法。

【问题讨论】:

    标签: java hibernate spring-boot jpql


    【解决方案1】:

    您可以使用@EntityGraph 获取grants 并使用JPA 方法查询specialNumber 选择

    @EntityGraph(attributePaths = {"grants"})
    public List<Ticket> findByGrantsSpecialNumber(Integer specialNumber);
    

    或者

    你可以使用@NamedEntityGraph

    @NamedEntityGraph(name = "Ticket.Grants", attributeNodes = { @NamedAttributeNode("grants") })
    public class Ticket {
    

    @EntityGraph(value = "Ticket.Grants", type = EntityGraphType.LOAD)
    public List<Ticket> findByGrantsSpecialNumber(Integer specialNumber);
    

    【讨论】:

    • 不确定,这对我不起作用。我仍然通过授权获得票证,但其他授权不存在,因为它声明它是延迟加载的。
    • 刚试了下,也不行。我刚刚再次更新了 repo 类。尽管如此,不幸的是,出于法律原因,我只能发布简化的代码。我也将 Lombok 用于 getter、setter、builder 和 equals,结构更复杂,具有更多属性和关系,但最终归结为这一点。
    • @hecko84 这两种解决方案都对我有用,可能还有其他实现问题。再次检查我使用了findByGrantsSpecialNumber 而不是findByGrantSpecialNumber(某些版本会出现问题)
    • 如果我在注释中指定查询,行为会有所不同吗?也许这是一个愚蠢的问题,但在与 JPA 一起工作时遇到问题时,我总是觉得自己像个白痴:D
    • 其实 @Query@EntityGraph 不合作就是为什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2021-04-12
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多