使用hibernate 提取屬性 hibernate 註解@Formula


1 關於hibernate的@Formula用法和作用可以參照別的文章

2 hibernate提取屬性也叫做計算屬性,該屬性值是一個值讀屬性,是通過使用sql語句獲取得到的,常用的是統計數據

3 案例:我有一個employee實體類,該類有主鍵Id或name,月薪水(monthlySalary)等屬性(字段),你現在有一個想法想要獲取該employee的年薪,計算方式是月薪*12個月=年薪。

package net.ozar.exp.entity;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 
@Entity
@Table(name="EMPLOYEE")
public class Employee implements java.io.Serializable {
 
    private static final long serialVersionUID = -7311873726885796936L;
 
    @Id
    @Column(name="ID")
    private Integer id;
 
    @Column(name="FIRST_NAME", length=31)
    private String firstName;
 
    @Column(name="LAST_NAME", length=31)
    private String lastName;
 
    @Column(name="MONTHLY_SALARY")
    private float monthlySalary;
 
    public Employee() {
    }
 
    // getters and setters
     // ...
 
    public float getMonthlySalary() {
        return monthlySalary;
    }
 
    public void setMonthlySalary(float monthlySalary) {
        this.monthlySalary = monthlySalary;
    }
 
     /* This artificial property - as I call it - is a kind of a calculated property, but not with Hibernate derived property support - not just yet */
    public float getYearlySalary() {
        return this.monthlySalary * 12;
    }
 
}
4 上面這個是沒有加入hibernate @@Formula支持的用法,現在我們加入這個註解實現:

package net.ozar.exp.entity;
 
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
 
import org.hibernate.annotations.Formula;
 
@Entity
@Table(name="EMPLOYEE")
public class Employee implements java.io.Serializable {
 
    private static final long serialVersionUID = -7311873726885796936L;
 
    @Id
    @Column(name="ID")
    private Integer id;
 
    @Column(name="FIRST_NAME", length=31)
    private String firstName;
 
    @Column(name="LAST_NAME", length=31)
    private String lastName;
 
    @Column(name="MONTHLY_SALARY")
    private float monthlySalary;
 
    @Formula("MONTHLY_SALARY*12")
        private float yearlySalary;
 
    public Employee() {
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getFirstName() {
        return firstName;
    }
 
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
 
    public String getLastName() {
        return lastName;
    }
 
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
 
    public float getMonthlySalary() {
        return monthlySalary;
    }
 
    public void setMonthlySalary(float monthlySalary) {
        this.monthlySalary = monthlySalary;
    }
 
    public float getYearlySalary() {
        return yearlySalary;
    }
 
}
5 注意到上面這個案例的@Formla的值是關聯到“MONTHLY_SALARY”而yearlySalry屬性是沒有存儲如數據庫的。

6 一些更爲複雜用法

@Formula("(select min(l.creation_date) from Logs l where l.customer_id = id)")
private Date firstLoginDate;
注意:最後面的customer_id=id中後面的id的值也就當前對象的id值



發佈了45 篇原創文章 · 獲贊 68 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章