我正在创建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;
答案 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会发现两个后加载方法,即使签名是相同的。