在休眠中添加Case语句

时间:2017-11-08 08:17:55

标签: hibernate java-ee hibernate-annotations

我正在创建API,以JSON格式向客户发送响应。 我正在做什么,我在Mysql DB中有一个表,其中有一个主键。客户端请求使用该主键作为参数的数据,我使用hibernate从数据库获取数据并作为响应发送回客户端。

我的SQL查询:

select * from emp_table Where id = 202

在JSON Responce中我将发送表的所有列,如上面的Query中所示。直到这里我的代码工作正常。

但现在我使用case statement生成一个新列,如下面的查询所示:

select *, (case when sal > 4.5  then 'Yes' else 'No' end)  as bp_status from emp_table Where id = 202

如何在bp_status响应中发送新的JSON列?

我尝试了@Formula但没有工作

@Formula(value = "(case when sal > 4.5  then 'Yes' else 'No' end)")
private String bp_status; 

1 个答案:

答案 0 :(得分:0)

由于sal列位于emp_table,您的Employee实体具有sal属性且您的实体看起来像

@Entity
public class Employee{

    @Column(name = "sal")
    private Double sal;

}

然后如何使用加载实体后加载的瞬态属性?

import javax.persistence.Transient;
import javax.persistence.PostLoad;

@Entity
public class Employee{

    @Column(name = "sal")
    private Double sal;

    // define here as an attribute so that you can do
    // whatever you want in your JSON process
    @Transient
    private String bpStatus;

    public Employee(){
        // ...

        // initialise an empty value to avoid a NullPointerException
        // when processing your JSON
        this.bpStatus = "";
    }

    // Tell JPA to add additional stuff after loading the entity
    @PostLoad
    public void postLoad(){
        // simplified version: you must ensure that
        // sal is not null and stuff like that
        this.bpStatus = (sal > 4.5) ? "Yes" : "No";
    }

}

覆盖后加载方法时要小心:根据我的实验,您只需要@Override注释,不应该将重写方法注释为@PostLoad,因为JPA会发现两个后加载方法,即使签名是相同的。