在Spring JPA中使用@Enumerated和@Formula与Field上的Case

时间:2017-06-13 06:00:03

标签: java spring hibernate jpa spring-data-jpa

我有一个简单的类实体,如果当前日期超过scheduledClassDateTime,我想在其中自动将类的状态更改为Expired。

我的班级状态是一个类型为OnGoing和Expired的枚举。

我正在尝试使用以下内容将状态更改为已过期。

@Enumerated(EnumType.STRING)
@Formula(value = "case when class_Date_Time<now()) then 'EXPIRED' end ")
private ClassStatus classStatus = ClassStatus.OnGoing;

我收到以下错误(注意:现在已经解决,但保存在下面以供其他人参考)

  

FUNCTION classDateTime.compareTo不存在

     

org.springframework.dao.InvalidDataAccessResourceUsageException:无法提取ResultSet; SQL [不适用];嵌套异常是org.hibernate.exception.SQLGrammarException:无法提取ResultSet

更新

  1. 该问题已在@stainslav原始提示的帮助下得到解决,原因是使用了Object查询而不是Native查询。我更改了问题中的代码以反映这一点。

  2. 现在的问题是@Formula没有将EXPIRED保存到数据库......它将显示为空白。我不确定我正在使用@Formula

  3. 任何帮助表示赞赏

2 个答案:

答案 0 :(得分:2)

您的SQL错误

case when classDateTime.compareTo(LocalDateTime.now())<0 then 'EXPIRED' [else 'VALID'] end

其他部分是可选的。原始SQL未命中end

答案 1 :(得分:1)

您必须在@Formula中使用本机SQL,例如:

classDateTime > CURRENT_TIMESTAMP