如何处理构造函数中的可为空参数?
How to deal with nullable parameter in constructor?
我有两个 类、User
和 Team
。每个 User
可以有一个 favouriteTeam
但不是必须的。
创建新用户时,会收到一个请求,其中包含用户的用户名和他们最喜欢的球队的 teamID
。如果用户没有最喜欢的球队,则 teamID
值为 null
。
在 TeamRepository
中,使用提供的 teamID
值调用 findByTeamId
。如果 teamID
是 null
,则 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){
...
}
其他{
...
}
我有两个 类、User
和 Team
。每个 User
可以有一个 favouriteTeam
但不是必须的。
创建新用户时,会收到一个请求,其中包含用户的用户名和他们最喜欢的球队的 teamID
。如果用户没有最喜欢的球队,则 teamID
值为 null
。
在 TeamRepository
中,使用提供的 teamID
值调用 findByTeamId
。如果 teamID
是 null
,则 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 的 ctornew User(((Optional)team).isPresent()?((Optional)team).get():null);
尝试在user的构造函数中处理
If(最喜欢的球队== null){ ... }
其他{ ... }