Hibernate @Formula注解

来源:互联网 发布:百度网盘限速 知乎 编辑:程序博客网 时间:2024/09/21 08:18

在使用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)")中,不要忘记双引号和括号。

3 0
原创粉丝点击