首页 > 解决方案 > 如何将另一个类对象添加到列表中

问题描述

我有一个玩家类和朋友类,玩家类中有朋友对象。但是朋友类也有与玩家类相同的字段。如何将好友列表添加到播放器。就像在 facebook 上用户在他的朋友列表中有朋友一样。如何使 PlayerController 类中的注释方法起作用?

//@CrossOrigin(origins = "http://localhost:4200")
@RestController
@RequestMapping(value = "/players", produces = { MediaType.APPLICATION_JSON_VALUE })
public class PlayerController {

    @Autowired
    private PlayerReopsitory playerReopsitory;

    @GetMapping(produces = "application/json")
    public List<Player> getAllPlayers(){
        return playerReopsitory.findAll();
    }

    @PostMapping
//  @ResponseStatus(HttpStatus.OK)
    public void create(@RequestBody Player player) {
        playerReopsitory.save(player);
    }

    @GetMapping("/{id}")
    public Player getOne(@PathVariable("id") Long id) {
        return playerReopsitory.getOne(id);
    }

    @DeleteMapping("/{id}")
    void deletePlayer(@PathVariable Long id) {
        playerReopsitory.deleteById(id);
    }

    @PutMapping("/{id}")
    Player updatePlayer(@RequestBody Player newPlayer, @PathVariable Long id) {

        return playerReopsitory.findById(id).map(player -> {
            player.setName(newPlayer.getName());
            player.setEmail(newPlayer.getEmail());
            player.setPhone(newPlayer.getPhone());
            return playerReopsitory.save(player);
         }).orElseGet(() -> {
                newPlayer.setId(id);
                return playerReopsitory.save(newPlayer);
            });
        }


//  how to make this function work?
//  @GetMapping("/{id}/friends")
//  public List<Friend> getAllFriendFromList(@PathVariable Long id) {
//      return playerReopsitory.findById(id).get();
//  }
//  

}
@Entity
@Table(name= "user", schema = "rabbit")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Friend {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name="userName")
    private String userName;

    @Column(name="playername")
    private String name;

    @Column(name="email")
    private String email;

    @Column(name="phone")
    private String phone;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "Friend [id=" + id + ", userName=" + userName + ", name=" + name + ", email=" + email + ", phone="
                + phone + "]";
    }
}

@Entity
@Table(name= "user", schema = "rabbit")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Player {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(name="userName")
    private String userName;

    @Column(name="playername")
    private String name;

    @Column(name="email")
    private String email;

    @Column(name="phone")
    private String phone;

    private Friend friend;




    public Friend getFriend() {
        return friend;
    }

    public void setFriend(Friend friend) {
        this.friend = friend;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }



    @Override
    public String toString() {
        return "Player [id=" + id + ", userName=" + userName + ", name=" + name + ", email=" + email + ", phone="
                + phone + ", friend=" + friend + "]";
    }

public interface FriendReopsitory extends JpaRepository<Player, Long> {

}

public interface PlayerReopsitory extends JpaRepository<Player, Long> {

}
@Component
public class FriendService {


    private static Map<Friend, Long> getFriends = new HashMap<>();{

    }
}

标签: javaspring-bootspring-data-jpacrud

解决方案


由于 Friends 也是玩家,我建议您将模型重构为只有一个 Player 类,与自身具有多对多关系。

@Entity
public class Player {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    /*
    * Add other fields
    */

    @ManyToMany()
    @JoinTable(name = "player_friends", joinColumns = {
            @JoinColumn(name = "PLAYER_ID", referencedColumnName = "ID")
    }, inverseJoinColumns = {
            @JoinColumn(name = "FRIEND_ID", referencedColumnName = "ID")
    })
    private List<Player> friends;

    /*
    * Add other getters and setters
    */

    public List<Player> getFriends() {
        return this.friends;
    }

    /*
    * Implement addFriend and removeFriend methods
    */
}

然后,您将需要处理集合加载(LAZY 或 EAGER),添加和删除友元方法。但这不在这个问题的范围内,你可以在网上找到关于这个主题的大量资源。


推荐阅读