如何处理构造函数中的可为空参数?

How to deal with nullable parameter in constructor?

我有两个 类、UserTeam。每个 User 可以有一个 favouriteTeam 但不是必须的。

创建新用户时,会收到一个请求,其中包含用户的用户名和他们最喜欢的球队的 teamID。如果用户没有最喜欢的球队,则 teamID 值为 null

TeamRepository 中,使用提供的 teamID 值调用 findByTeamId。如果 teamIDnull,则 table 中没有被查询的 teamID 值为 null 的行,因此 findByTeamId 将 return 空值。因此需要Optional<Team>

但是,这会在构造新的 User 时引起问题,因为需要 Team 类型的参数,而不是 Optional<Team>。我尝试将 Users.favouriteTeam 的类型更改为 Optional<Team> 但这会导致不同的问题 (org.springframework.orm.jpa.JpaSystemException: Error accessing field [private long mygroup.tqbcbackend.model.Team.teamID] by reflection for persistent property [mygroup.tqbcbackend.model.Team#teamID] : Optional.empty; nested exception is org.hibernate.property.access.spi.PropertyAccessException: Error accessing field [private long mygroup.tqbcbackend.model.Team.teamID] by reflection for persistent property [mygroup.tqbcbackend.model.Team#teamID] : Optional.empty)。

处理这个问题的最佳方法是什么?

User.java

@Entity
@Table(name = "Users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "UserID")
    private long userID;
    
    @Column(name = "Username")
    private String username;

    @Nullable
    @ManyToOne(
            targetEntity = Team.class,
            fetch = FetchType.LAZY
    )
    @JoinColumn(name = "FavouriteTeamID")
    private Team favouriteTeam;

    public User() {
    }

    public User(String username, Team favouriteTeam) {
        this.username = username;
        this.favouriteTeam = favouriteTeam;
    }

    // getters and setters
}

Team.java

@Entity
@Table(name = "Teams")
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "TeamID")
    private long teamID;

    @Column(name = "TeamName")
    private String teamName;

    @OneToMany(
            targetEntity = User.class,
            fetch = FetchType.LAZY,
            mappedBy = "favouriteTeam"
    )
    private List<User> fans;

    // constructors and getters and setters 
}

TeamRepository.java

@Repository
public interface TeamRepository extends JpaRepository<Team,String>{
    
    public Optional<Team> findByTeamID(Long teamID);

}

Hence Optional<Team> is required.,不,不是(但是方便)。

您可以声明

public Team findByTeamID(Long teamID);

如果 teamID 不存在,你会得到一个 (Team) null 返回。

如果您继续使用 Optional,您可以使用

调用 User 的 ctor
new User(((Optional)team).isPresent()?((Optional)team).get():null);

尝试在user的构造函数中处理

If(最喜欢的球队== null){ ... }

其他{ ... }