2017-07-26 21 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コンソールでレッスンのテーブルを見ると、 "weekday"のような列はありません

また、@Formulaアノテーションなしでstart_dateパラメータを取るセッタを使用して他のオプションを試しましたが、このセッタは決してないと思います列「平日」にはnullが設定されているため、呼び出されます。 ここで私は、代替ソリューションとして使用することを試みたセッターです:

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

それは私がここで何かが欠けてることは明らかです私はまだ春のブートを学んでいるので、それはおそらくです...

へ合計 - テーブルレッスンで同じテーブルの別の列から計算された列が必要です。

+0

注意すべき点は、timeパッケージは、java.util.Dateまたはsql.Dateよりもはるかに完全で優れたシステムであり、どちらもさまざまな方法で壊れていることです。それに切り替えるか、JodaTimeを検討する必要があります。 –

答えて

3

@Formulaは、ルールによってフィールドが計算されることを意味します。このエンティティフィールドはdbの列ではありません。このフィールドは、指定されたルールで、各エンティティの読み込み時間を計算します。

注釈@Column(name = "weekday")@Formulaの近くで動作する場合、読み込まれたエンティティでDBと同じ値が予想される場合は、実際には混乱しますが、ここでは1つの異なる(矛盾した状況)が計算されます。

あなたはLessonテーブルからここに値を保存したい場合は、@Formulaを削除し、​​または@PrePersistと使用でマークされた方法はweekdayに計算された値を設定するための操作を対応定義することができます春の豆YourEntityJpaCallbacksListener@EntityListeners({YourEntityJpaCallbacksListener.class})を使用する必要があります。例えば

@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

[OK]を、ので、私はこの問題を解決するために管理していると思います。

@Formula注釈を削除しました 曜日を計算してweekDayに書き込むメソッドを作成しました。

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

と私はstart_dateのセッターの内側にそれを置く:START_DATEが作成または更新されevertime

public void setStart_date(Date start_date) { 

    this.start_date = start_date; 
    calculateDayOfWeek(); 
} 

をだから今、それは平日の値を更新(または作成します)。

関連する問題