【问题标题】:Spring Boot JPA how to retrieve data from a ManyToMany table?Spring Boot JPA 如何从 ManyToMany 表中检索数据?
【发布时间】:2021-03-03 10:09:09
【问题描述】:

我正在学习 Spring Boot。 现在我与一个用户实体和一个团队实体有多对多关系。 所以一个用户可以有多个团队,一个团队可以有多个用户。

   @Entity
    public class User {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="id", nullable =false, updatable = false)
        private Long id;
@ManyToMany
    @JoinTable(
            name = "team_have",
            joinColumns = @JoinColumn(name = "id"),
            inverseJoinColumns = @JoinColumn(name = "teamId"))
    List<Team> haveTeams;

这是团队实体:

@Entity
@Table(name="TEAM")
public class Team {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long teamId;
    @OneToMany(cascade = CascadeType.ALL, mappedBy="team")
    private List<Task> tasks;

这是我的仓库:

public interface TeamRepository extends CrudRepository<Team, Long>{
    List<Team>findByName(String name);
    
}

如何找到属于一个用户的所有团队?

【问题讨论】:

  • 将此添加到您的团队存储库中:ListfindByUser(User user);

标签: java spring-boot jpa spring-data-jpa spring-data


【解决方案1】:

用户已经使用List&lt;Team&gt;进行映射,您需要使用UserRepository而不是TeamRepository

public interface UserRepository extends CrudRepository<User, Long>{
    User findByName(String name);
    
}

在这里,您将获得一个用户,该用户拥有他所属的所有团队。 (假设用户名是唯一的)

如果您有双向多对多(团队也映射Lis&lt;User&gt;),如下所示

@Entity
@Table(name="TEAM")
public class Team {

    ....
    @ManyToMany(cascade = CascadeType.ALL, mappedBy="haveTeams")
    private List<User> users;

然后您可以定义如下查询方法来获取一个用户的所有团队,

public interface TeamRepository extends CrudRepository<Team, Long>{
    List<Team> findByUsers(User user);
    
}

【讨论】:

    【解决方案2】:

    在它们之间建立连接的最佳方式是使用双向关系,如下所示:

    User Entity

    @Entity
    @Table(name = "user")
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        /* @Column(name = "id", nullable = false, updatable = false) You don't need this, 
        the name is taken from the name of the variable and it cannot be null since you 
        have @GeneratedValue */
        private Long id;
    
        @ManyToMany(fetch = LAZY, cascade = CascadeType.PERSIST)
        @JoinTable(
            name = "user_team", // I would name this user_team since the user can have many teams, and vice versa
            joinColumns = @JoinColumn(name = "user_id" , referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "team_id",  referencedColumnName = "id"))
         Set<Team> teams = new HashSet<>();
    }
    

    Team Entity

    @Entity
    @Table(name="team")
    public class Team {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private long teamId;
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "team")
        private List<Task> tasks;
    
        @ManyToMany(mappedBy = "teams", fetch = LAZY, cascade = CascadeType.PERSIST)
        private Set<User> users = new HashSet<>();
    }
    

    Team Repo

    public interface TeamRepository extends CrudRepository<Team, Long>{
         @Query(value = "SELECT * FROM team t1 INNER JOIN user_team t2 ON t1.id = t2.team_id WHERE t2.user_id = ?1 ")
        List<Team> findAllByUserId(long userId);
    }
    

    使用示例:

    List<Team> teams = teamRepo.findAllByUserId(1);
    

    一个很棒的教程: https://attacomsian.com/blog/spring-data-jpa-many-to-many-mapping

    【讨论】:

      猜你喜欢
      • 2020-02-04
      • 2017-02-02
      • 2021-11-12
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 2015-07-24
      相关资源
      最近更新 更多