spring boot - 计算字段

时间:2017-07-26 09:44:24

标签: spring hibernate spring-boot

所以,我有一个实体,它有字段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中有一个列,它是从同一个表的另一列计算的。

2 个答案:

答案 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的值。