2015-08-25 37 views
5

很多時候我在我的實體中使用@Formula。但總是它是一個簡單的查詢或帶有參數的存儲過程,我可以從表格中提取參數。現在我需要從相關對象中使用一些屬性。但是當我嘗試從數據庫中獲取對象時,我會看到異常。請看下面的例子如何在Hibernate中使用實體字段@Formula

@Entity 
@Table(name = "MINISTRY") 
public class Ministry { 

    @Id 
    @Column(name = "ID") 
    private Long id; 

    @Column(name = "NAME") 
    private String name; 

    // unnecessary code 

} 

@Entity 
@Table(name = "DEPARTMENT") 
public class Department { 

    @Id 
    @Column(name = "ID") 
    private Long id; 

    @Column(name = "DEP_NAME") 
    private String departmentName; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "MINISTRY_ID") 
    private Ministry ministry; 

    // unnecessary code 
} 

@Entity 
@Table(name = "EMPLOYEE") 
public class Employee { 

    @Id 
    @Column(name = "ID") 
    private Long id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "DEPARTMENT_ID") 
    private Department department; 

    @Formula("test_package.calc_something(department.ministry.id)") 
    private BigDecimal someMetric; 

    // unnecessary code 

} 

我應該如何在@Formula中使用實體prop。 我不希望如果你讀的Formula的JavaDoc寫類似

select d.ministry.id from Department d ... 

回答

5

您將看到:

的公式必須是一個有效的SQL片段

所以您將不得不使用SQL:

@Formula("test_package.calc_something(" 
      + "select DEP.MINISTRY_ID from DEPARTMENT DEP where DEP.ID = DEPARTMENT_ID" 
     + ")") 
private BigDecimal someMetric; 

在將它寫入SQL之前,Hibernate在碎片中修改的唯一東西是:它會將表別名添加到列中(因爲您無法預測這一點)。我提到這一點,因爲只有一個基本的SQL解析器用於此目的,它會將錯誤位置的別名插入到更復雜的片段中。

關於性能的一句話:的公式爲您加載,即使你只需要使用屬性進行排序或篩選(從屬性的名稱只是猜測)每Department實體執行 - 除非你使用@Basic(fetch = FetchType.LAZY)並轉動字節碼儀器(或模擬FieldHandled)。

+0

感謝您的回答。但我寫了一個壞榜樣。任務是採取相關對象的參數。我更新了例子。提前致謝。 – Dmitry

相關問題