OpIvy
OpIvy

Reputation: 37

How to force Hibernate JPA to create a join query

I am currently working on a spring boot app using Spring Data JPA and Hibernate. My current setup looks like:

My TeamMapping Repository:

public interface TeamMembershipMapping Repository extends JpaRepository<TeamMembershipMapping, Integer>
{
    public List<TeamMembershipMapping> getByMemberId(Integer memberId, Pageable pageable);
}

My TeamMembershipMapping Entity:

@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---
}

And my Team Entity:

@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---
}

Now my issue is that when I call getByMemberId to retrieve all the TeamMembershipMappings that a particular member has, Hibernate is generating an sql select to get all the TeamMappings, then doing an sql select for each of those Mappings to get the Team information. So if the member is part of 4 teams, thats 1+4 sql selects when it could be done all in one join.

So how do I force Hibernate to scoop up all the information in one big join select?

Upvotes: 1

Views: 1640

Answers (1)

Qianyue
Qianyue

Reputation: 1777

In the entity TeamMembershipMapping, you can create a namedQuery like this :

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

It is just a simple query.

Upvotes: 2

Related Questions