如何在Hibernate/JPA的實體和查詢中使用Java 8 Optional?

banq發表於2019-02-09

將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);
}


 

相關文章