【问题标题】:Using @Enumerated and @Formula with Case on a Field in Spring JPA在 Spring JPA 中的字段上使用 @Enumerated 和 @Formula
【发布时间】:2017-11-14 18:04:31
【问题描述】:

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

My Class Status 是一个 Enum,类型为 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:无法提取结果集; SQL [不适用];嵌套异常是 org.hibernate.exception.SQLGrammarException: could not extract ResultSet

更新

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

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

任何帮助表示赞赏

【问题讨论】:

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


    【解决方案1】:

    你的 SQL 错误

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

    其他部分是可选的。原SQL小姐end

    【讨论】:

    • +1 哎呀...这是一个错字。我更正了它,我收到以下错误 - “FUNCTION classDateTime.compareTo 不存在”。适当地编辑了问题并为您的努力投票。
    • 现在看来您正在尝试在 SQL 表达式中使用 java 类。 DB 不知道您的课程。使用 DB 表列以及 DB 特定表达式而不是 now()
    • 就是这样。我使用的是 JPQL 查询而不是本机查询。但是,我奇怪地面临 EXPIRED 未保存到数据库的问题。我对@Formula 的理解不正确吗?
    • @Formula 是只读表达式标记。它可以有一个表达式甚至是子选择,例如@Formula(value = "(select count(*) from ... where some_id=id) ")。无法保存。
    • 我将介绍两个字段 - 基于@Formula 的只读字段和与真实列关联的状态字段以使其保存。还可以使用@PrePersist@PreUpdate 检查状态值并从基于只读公式的字段中更新状态。
    【解决方案2】:

    您必须在 @Formula 中使用原生 SQL,例如:

    classDateTime > CURRENT_TIMESTAMP
    

    【讨论】:

    • 谢谢。你没看错,但斯坦尼斯拉夫早先提出了这个建议。 +1
    猜你喜欢
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多