Formula作用就是说白了就是用一个查询语句动态的生成一个类的属性,比如收件箱显示有几封未读邮件的数字,就是一条select count(*)...构成的虚拟列,而不是存储在数据库里的一个字段。
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中写的是纯SQL语句而非HQL语句,且SQL要写在@Formula("(SQL)")中,不要忘记双引号和括号。
formula 可以利用SQL语动态的生成java属性(实体要存在相应的属性),规则是 在from后边必须是表名,当有where条件时必须有别名,以便调用。
和虚拟列的差别是 虚拟列只能在调用本类中的数据,而formula还可以调用别的表中的数据。