所以,我有一个实体,它有字段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控制台中查看Lesson表时,没有像“工作日”这样的列
我还尝试了其他选项 - 没有@Formula注释和带有start_date参数的setter,但我想这个setter永远不会被调用,因为“weekday”列填充了null。 这是我试图用作替代解决方案的setter:
public void setWeekDay(Date start_date) {
Calendar c = Calendar.getInstance();
c.setTime(start_date);
this.weekDay = c.get(Calendar.DAY_OF_WEEK);
}
很明显,我在这里遗漏了一些东西,可能是因为我还在学习Spring启动...
总结一下 - 我想在表Lesson中有一个列,它是从同一个表的另一列计算的。
答案 0 :(得分:3)
@Formula
表示您的字段由您的规则计算。此实体字段不是db中的列。此字段按指定规则计算加载时间中的每个实体。
如果注释@Column(name = "weekday")
在@Formula
附近工作,如果您希望加载的实体与DB中的值相同,那么您会感到很困惑,但这里计算的是一个不同的(不一致的情况)。
如果您希望从Lesson
表中保存此值,则应移除@Formula
并使用@EntityListeners({YourEntityJpaCallbacksListener.class})
在Spring bean YourEntityJpaCallbacksListener
中,您可以定义标有@PreUpdate
的方法}或@PrePersist
并使用相应的操作将计算值设置为weekday
。
例如:
@EntityListeners({YourEntityJpaCallbacksListener.class})
@Entity
public class YourEntity{
// your code
}
@Component
public class YourEntityJpaCallbacksListener {
@Autowired
private LessonRepository lessonRepository;
@PreUpdate
void preUpdate(YourEntity yourEntity) {
if (recurrentRuleRepository.exists(yourEntity.getId())) {
Integer weekDay = lessonRepository.findOne(yourEntity.getId());
yourEntity.setWeekDay(weekDay);
}
}
}
答案 1 :(得分:0)
好的,所以我想我已经设法解决了这个问题。
我删除了@Formula注释 我创建了一个计算星期几并将其写入weekDay的方法。
public void calculateDayOfWeek(){
Calendar c = Calendar.getInstance();
c.setTime(start_date);
this.weekDay = c.get(Calendar.DAY_OF_WEEK);
}
我把它放在start_date setter中:
public void setStart_date(Date start_date) {
this.start_date = start_date;
calculateDayOfWeek();
}
现在,evertime创建或更新start_date,它会更新(或创建)weekDay的值。