有时我们如果想要查询某些不在该表的字段,我们可以不用hql来实现,hibernate为我们提供了@Formula这个注解,通过这个注解我们可以达到我们想要的结果,代码如下:
package com.cmh.beans;
import javax.persistence.*;
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;
}
public int id;
@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;
}
public String getSexValue() {
return sexValue;
}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public void setSexValue(String sexValue) {
this.sexValue = sexValue;
}
}
我们的junit如下:
package com.cmh.test;
import com.cmh.Application;
import com.cmh.beans.Girls;
import com.cmh.beans.TestFormula;
import com.cmh.dao.UserDao;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.persistence.EntityManager;
import org.springframework.transaction.annotation.Transactional;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* Created by mianhai on 2017/2/15.
*/
@RunWith(SpringJUnit4ClassRunner.class) // SpringJUnit支持,由此引入Spring-Test框架支持!
@SpringApplicationConfiguration(classes = Application.class)
public class MyTest {
@Autowired
private UserDao userDao;
@Autowired
private EntityManager en;
@Test
@Transactional
public void mytest(){
List< TestFormula> girl = (List< TestFormula>)en.createQuery("select t from TestFormula t").getResultList();
Iterator it = girl.iterator();
while (it.hasNext()){
it.next();
}
}
}
运行结果
Hibernate: select testformul0_.id as id1_3_, testformul0_.sex as sex2_3_, testformul0_.sex_value as sex_valu3_3_, testformul0_.user_id as user_id4_3_, (select t.user_name from user_info t where t.user_id = testformul0_.user_id) as formula0_ from test_formula testformul0_
注意,这里面@Formula中的为sql,非hql