将Java 8 Optional视为处理所有的空值的“银弹”可能会带来更多弊大于利。合适它们是最好的方法。
本文的应用程序是在实体和查询中如何正确使用Java 8 Optional的概念证明。
关键点:
- 使用Spring Data内置查询方法返回Optional(例如findById())
- 编写我们自己的查询返回Optional
- 在实体getter使用Optional
- 为了运行不同的场景,检查文件:data-mysql.sql
源代码可以在这里找到 。@Entity public class TennisPlayer implements Serializable {
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
private String name; @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name = "tournament_id") private Tournament tournament;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public Optional<String> getName() { return Optional.ofNullable(name); }
public void setName(String name) { this.name = name; }
public Optional<Tournament> getTournament() { return Optional.ofNullable(tournament); }
public void setTournament(Tournament tournament) { this.tournament = tournament; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof TennisPlayer)) { return false; } return id != null && id.equals(((TennisPlayer) obj).id); }
@Override public int hashCode() { return 2018; } }
|
@Repository public interface TennisPlayerRepository extends JpaRepository<TennisPlayer, Long> { @Transactional(readOnly=true) Optional<TennisPlayer> findByName(String name); }
|