2017-07-26 51 views
3

所以,我有一個實體,它具有字段start_date(java.util.Date是類型)。春季開機 - 計算字段

我想擁有另一個字段,它會自動填充對應於開始日期的星期幾(如星期日的數字1,星期一的2,等等)的整數。

這裏是我的實體的片段:

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

@DateTimeFormat(pattern = "yyyy-MM-dd") 
@Temporal(TemporalType.DATE) 
private Date start_date; 

我已經嘗試添加下列方式計算字段:

@Column(name = "weekday") 
@Formula("(select dayofweek(l.start_date) from Lesson l where l.id = id)") 
private Integer weekDay; 

然而,在課程表中H2控制檯看時,有沒有這樣的列「工作日」

我也嘗試過其他選項 - 沒有@Formula註釋和setter採取start_date參數,但我想這個setter是從來沒有稱爲,因爲「weekday」列填充了null。 這裏的二傳手我已經試過作爲一種替代解決方案中使用:

public void setWeekDay(Date start_date) { 
    Calendar c = Calendar.getInstance(); 
    c.setTime(start_date); 
    this.weekDay = c.get(Calendar.DAY_OF_WEEK); 
} 

很明顯,我在這裏失去了一些東西,這可能是因爲我還在學習春天開機...

要總結 - 我想在表Lesson中有一列,它是從同一個表的另一列計算出來的。

+0

另一件需要注意的事情是,time package比java.util.Date或sql.Date更加完整和更好用,它們都以各種方式被破壞。你應該考慮切換到它或JodaTime。 –

回答

3

@Formula表示您的字段按您的規則計算。這個實體字段不是db中的列。該字段按指定的規則計算加載時間中的每個實體。

如果註釋@Column(name = "weekday")會在@Formula附近工作,如果您希望裝入的實體與DB中的值相同,但這裏計算出的是一個不同的(不一致的情況),那麼您會感到非常困惑。

如果你想在這裏保存從Lesson表中的值,你應該刪除@Formula和使用@EntityListeners({YourEntityJpaCallbacksListener.class})春豆YourEntityJpaCallbacksListener您可以定義打上​​或@PrePersist和使用方法對應的操作設定的計算值到weekday

例如:

@EntityListeners({YourEntityJpaCallbacksListener.class}) 
@Entity 
public class YourEntity{ 
    // your code 
} 

@Component 
public class YourEntityJpaCallbacksListener { 
    @Autoware 
    LessonRepository lessonRepository; 

    @PreUpdate 
    void preUpdate(YourEntity yourEntity) { 
     if (recurrentRuleRepository.exists(yourEntity.getId())) { 
      Integer weekDay = lessonRepository.findOne(yourEntity.getId()); 
      yourEntity.setWeekDay(weekDay); 
     } 
    } 

} 
+0

你是對的,我實際上(終於)設法解決這個問題,根本不使用@Formula。我創建了一個將數據寫入weekDay的方法,並且我將它從start_date setter中調用,所以每次都會創建start_date或更新此方法。 –

+0

感謝您的幫助!你的解決方案似乎更加優雅 –

+0

對這裏很好。你已經解決了它的任何方式,我認爲它會改善你的體驗。 – Sergii

0

好了,我想我已經設法解決這個問題。

我刪除了@Formula註釋 我創建了一個計算星期幾並將其寫入weekDay的方法。

public void calculateDayOfWeek(){ 
    Calendar c = Calendar.getInstance(); 
    c.setTime(start_date); 
    this.weekDay = c.get(Calendar.DAY_OF_WEEK); 
} 

我把它起始日期二傳手內:

public void setStart_date(Date start_date) { 

    this.start_date = start_date; 
    calculateDayOfWeek(); 
} 

所以,現在,evertime創建或更新的起始日期,它更新(或創建)平日的價值。