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