如何强制Hibernate JPA创建联接查询

如何强制Hibernate JPA创建联接查询,hibernate,spring-data-jpa,Hibernate,Spring Data Jpa,我目前正在使用SpringDataJPA和Hibernate开发SpringBoot应用程序。我当前的设置如下所示: 我的团队映射存储库: 和我的团队实体: 现在我的问题是,当我调用getByMemberId来检索特定成员拥有的所有TeamMembershipMappings时,Hibernate生成一个sql选择来获取所有TeamMappings,然后对每个映射执行sql选择来获取团队信息。因此,如果成员是4个团队的一部分,那么1+4 sql将选择何时可以在一个连接中完成所有操作 那么,如

我目前正在使用SpringDataJPA和Hibernate开发SpringBoot应用程序。我当前的设置如下所示:

我的团队映射存储库:

和我的团队实体:

现在我的问题是,当我调用getByMemberId来检索特定成员拥有的所有TeamMembershipMappings时,Hibernate生成一个sql选择来获取所有TeamMappings,然后对每个映射执行sql选择来获取团队信息。因此,如果成员是4个团队的一部分,那么1+4 sql将选择何时可以在一个连接中完成所有操作


那么,如何强制Hibernate在一个大连接选择中收集所有信息呢?

在实体
TeamMembershipMapping
中,您可以创建如下命名查询:

select tmm.team from TeamMembershipMapping tmm where tmm.memberId = :memberId;

这只是一个简单的查询。

从您的TeamMembershipMapping实体中,我看到每个成员只能有一个团队,因为团队设置为
@OneToOne(fetch=FetchType.EAGER)
。每个成员可以有多个团队。TeamMembershipMapping只是成员和团队之间多对多关系的连接表。在当前状态下,我在选择ByMemberId时返回了多个团队成员身份,这是我关心的SQL查询优化?HQL?这称为“n+1”,搜索“hibernate n+1 join”或类似的内容会给您带来好的结果。这里有一个问题:除了namedQuery之外,还有其他强制连接的方法吗?也许是对成员变量的注释?我想避免一个命名查询,我觉得它很混乱。
@Entity
@Table(name = "teamMembership")
public class TeamMembershipMapping
{
    @Id
    private Integer teamMembershipId;

    @Column(table = "teamMembership", name = "memberId")
    private Integer memberId;

    @Enumerated
    @Column
    private TeamMembershipStatus status;

    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "teamId")
    private Team team;

    ---Getters and Setters---
}
@Entity
@Table(name = "team")
@SecondaryTable(name = "summaryTeam")
public class Team
{
    @Id
    private Integer teamId;

    @Column
    private String name;

    @Column
    private String description;

    @Column(table = "summaryTeam")
    private Integer wins;

    @Column(table = "summaryTeam", nullable = true)
    private Integer losses;

    --Getters and Setters---
}
select tmm.team from TeamMembershipMapping tmm where tmm.memberId = :memberId;