2016-08-24 64 views
0

我正在关注hibernate上的一个教程,并且在实体上只有一个字段应该选择。然而,在保存实体时,该字段在插入查询中并最终出错。请协助。hibernate @formula只选择字段

@Entity 
@Table(name="finances_user") 
@Access(value=AccessType.PROPERTY) 
public class User { 

    ... 
    private Date birthDate; 

    @Formula("lower(datediff(curdate(), birth_date)/365)") 
    private int age; 

    @Column("BIRTH_DATE") 
    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 
    ... 
} 

我曾尝试以下为好,

@Formula(value = "select lower(datediff(curdate(), birth_date)/365) from finances_user l where l.USER_ID = userId") 

下面是错误堆栈,该领域“时代”在插入查询使用。它应该是一个只选择的字段。

DEBUG - insert into finances_user (age, BIRTH_DATE, CREATED_BY, CREATED_DATE, EMAIL_ADDRESS, FIRST_NAME, LAST_NAME, LAST_UPDATED_BY, LAST_UPDATED_DATE, USER_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
DEBUG - could not execute statement [n/a] 
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'age' in 'field list' 

回答

0

你注释您的实体@Access(value=AccessType.PROPERTY)这基本上意味着Hibernate使用的干将确定将被映射到数据库列的属性名称。你有一个getAge()。删除此批注以便仅将注释为@Column的字段与db中的相应列关联。

+0

谢谢。有效。所以属性注释将不会使用公式字段。或者有没有其他的方法可以做到这一点 – Sekar

+0

你可以通过在获取者上放置@ @ Column来使用属性访问类型。通过从类中去除@ @ Access,你可以通过在一个字段(对于AccessType.FIELD)或一个获得者(对于AccessType.PROPERTY)中加入'@ Column'来在实体中组合访问类型。 – veljkost