【问题标题】:Jpa search by child property does not fetch all childsJpa 按子属性搜索不会获取所有子项
【发布时间】:2020-05-14 13:14:41
【问题描述】:

我需要在一个查询中按子 ID 查找所有父实体,但结果我需要拥有所有子实体的父实体。父母总是只有一个孩子的集合(来自搜索的ID)。条件应该是 适用于搜索但不适用于获取孩子。是否可以在一个查询中执行此操作?请帮忙。

@Entity
@Table(name = "user_hub")
public class UserHub {

    @Id
    private Integer id;

    private String name;

    private String description;

    @OneToMany(mappedBy = "hub", fetch = FetchType.LAZY)
    private Set<UserHubMember> hubMembers= new HashSet<>();
}


@Entity 
@Table(name = "user_hub_member")
public class UserHubMember implements Serializable {

    private Integer id;

    private string name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "\"hubId\"", insertable = false, updatable = false)
    private UserHub hub;

    public UserHubMember () {
    }
}

 @Query("select uh from UserHub uh " +
                    "left join fetch uh.hubMembers hm" +
                    "where hm.id = :memberId"
    )
    List<UserHub> findAllByMemberId(Integer memberId);

【问题讨论】:

  • 这个答案能解决你的问题吗? stackoverflow.com/a/61616565/4207306
  • 不,结合实体图与 jpql 查询给出相同的结果
  • 使用实体图和方法名查询,不要使用JPQL
  • 不幸的是方法名查询和实体图结果一样

标签: java spring jpa spring-data-jpa


【解决方案1】:

如果我误解了你的问题,请纠正我,你想得到父母: (拥有 id 与特定 id 相同的子实体以及其他不满足条件的子实体)

 @Query("select uh from UserHub uh left join fetch uh.hubMembers hm where hm.id = :memberId")
 List<UserHub> findAllByMemberId(Integer memberId);

在 JPA 方面使用 JOINJOIN FETCH 之间存在巨大差异。

您无法通过查询来实现这一点,因为您只获取一个子实体,而无法通过显式指定 join fetch

获取其他子实体

你应该这样做:

@Query("select uh from UserHub uh join uh.hubMembers hm where hm.id = :memberId")
List<UserHub> findAllByMemberId(Integer memberId);

这将使父母各自拥有所有符合平等标准的子实体

【讨论】:

  • 感谢您的回答。但是,如果我不使用 fetch 我会得到延迟初始化异常,因为孩子根本没有被 fectched...
  • 如果您使用休眠方式手动关闭会话并尝试获取子对象,则会出现异常,但如果您在 Service 类上使用 @Transactional,它会自动处理。
  • 是的,但是对于每个父母来说,这将是另一个对数据库的请求来获取孩子。如果我们谈论 10 000 名父母,那看起来不太好。
猜你喜欢
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多