Hibernate @Formula导致org.hibernate.HibernateException:缺少列

时间:2015-12-25 08:46:15

标签: java hibernate postgresql calculated-columns

我已经使用计算字段isIdle跟踪了实体:

@Entity
@Table(name = Customer.TABLE)
public class Customer {

    // ...

    @JsonIgnore
    private static final String IS_IDLE_SQL =
        "CASE WHEN (trunc(extract(epoch from now())) - coalesce(last_user_login_time,0) " +
        "> 5 * 24 * 3600 ) THEN 1 ELSE 0 END";

    @Formula(IS_IDLE_SQL)
    private Integer isIdle;

    public Integer getIsIdle() {
        return isIdle;
    }

    public void setIsIdle(Integer isIdle) {
        this.isIdle = isIdle;
    }
}

如果last_user_login_time包含过去5天内的UNIX时间戳,则该字段应为0,否则为1。

在计算时,我的数据库表中没有相应的列。 部署应用程序时,出现以下错误:

org.hibernate.HibernateException: Missing column: isIdle in public.customer
    at org.hibernate.mapping.Table.validateColumns(Table.java:366)

为什么Hibernate会尝试为此计算字段找到一列? 该数据库使用PostgreSQL。

1 个答案:

答案 0 :(得分:0)

我通过将SQL语句放在@Formula注释中解决了我的问题,如下所示:

@Formula("CASE WHEN (trunc(extract(epoch from now())) - coalesce(last_user_login_time,0) " +
    "> 5 * 24 * 3600 ) THEN 1 ELSE 0 END")
private Integer isIdle;