2012-09-10 84 views
4

使用Hibernate 3.5.3:休眠用戶類型映射@Formula導致非實體的自定義對象

在數據庫是一個函數(即使用Oracle的流水線表函數)供給時,它返回一個數量的行和值的實體的ID。 (此功能是遺留代碼的一部分,不能更改)。

結果例子:

select * from table(DateOptions_Function('ID_OF_ENTITY')); 

OPTION  DATE  
----------------------- 
startDate 2012/09/01  
endDate  2013/04/01 
otherDate 2011/01/01 

我要映射@Formula的結果(包含上述SQL)對實體的對象。

public class DateOptions { 
    private LocalDate startDate; 
    private LocalDate endDate; 
    private LocalDate otherDate; 

    // getters and setters omitted 
} 

我要地圖它像這樣的實體:

@Formula("(select * from table(DateOptions_Function(ENTITY_ID)))") 
@Type(type = "mypackage.DateOptionsUserType") 
public DateOptions getDateOptions() { 
    return dateOptions; 
} 

我曾嘗試與創建使用ResultSetnullSafeGet(...)一個DateOptions對象的創建希望一個Hibernate UserType

我在DateOptionsUserType

public int[] sqlTypes() { 
    return new int[] {Types.VARCHAR, Types.DATE}; 
} 

指定SQL類型我不斷收到以下異常啓動時,雖然: org.hibernate.MappingException: property mapping has wrong number of columns: mypackage.MyEnity.dateOptions type: mypackage.DateOptionsUserType(我也曾嘗試CompositeUserType具有相同的結果)。

任何想法可能會導致這個問題?它甚至可能(將@Formula映射到自定義非實體對象)?

回答

0

因爲你basicly有一個公式3場,我會看,如果執行函數3次仍不夠快

@Formula("(select DATE from table(DateOptions_Function(ENTITY_ID))) WHERE option='startDate'") 
private LocalDate startDate; 

@Formula("(select DATE from table(DateOptions_Function(ENTITY_ID))) WHERE option='endDate'") 
private LocalDate endDate; 

@Formula("(select DATE from table(DateOptions_Function(ENTITY_ID))) WHERE option='otherDate'") 
private LocalDate otherDate;