在使用Hibernate时经常会遇到实体类某个字段存的是code值而非我们最终想要的中文具体显示的值,如果使用Hibernate的一对一关联这种,一个属性还好说,但是如果一个实体类里有多个字段都是需要转换数据字段的,就麻烦了,用HQL写关联也比较费事,突然发现Hibernate @Formula这个注解可以解决此问题,在此记录一下,之前在网上看到,说此注解必须写在属性上,而不能写在get或set方法上,如果有其他注解写在方法上则 @Formula注解失效。这估计是Hibernate 之前的版本,我使用Hibernate4并没有发现此问题,所有注解全部写在get方法上,@Formula注解成功生效。
实体类如下:
package com.hibernate.ano.formula;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import org.hibernate.annotations.Formula;
/**
* @ClassName: TestFormula.java
*
* @Description: Hibernate @Formula注解
*
* @author GERRARD
*
* @date 2015年1月27日下午2:06:03
*
*/
@Entity
@Table(name = "test_formula")
public class TestFormula {
/**
* 用户ID
*/
private String userId;
/**
* 性别ID
*/
private String sex;
/**
* 虚拟字段:根据userId从user_info表获取中文名
*/
private String userName;
/**
* 虚拟字段:根据sex从code_list表获取对应汉字值
*/
private String sexValue;
public TestFormula() {
}
public TestFormula(String userId, String sex) {
this.userId = userId;
this.sex = sex;
}
@Column(name = "user_id", length = 25)
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
@Column(name = "sex", length = 3)
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Formula("(select t.user_name from user_info t where t.user_id = user_id)")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
@Formula("(select t.code_value from code_list t where t.code = sex)")
public String getSexValue() {
return sexValue;
}
public void setSexValue(String sexValue) {
this.sexValue = sexValue;
}
}
其中
@Formula("(select t.user_name from user_info t where t.user_id = user_id)")
表示这个字段的值,是表user_info 中user_name 的值,过滤条件是user_id =当前实体类userId对应的值,加入查询test_formula这个表后,这个实体类的userId的值是admin,那么where t.user_id = ‘admin’,最后 本实体类中的userName就等于 ‘系统管理员’
@Formula("(select t.code_value from code_list t where t.code = sex)")同样道理
这里需要注意的是:@Formula中写的是纯SQL语句而非HQL语句,且SQL要写在@Formula("(SQL)")中,不要忘记双引号和括号。