Hibernate UserType将@Formula结果映射到非实体自定义对象

时间:2012-09-10 14:56:34

标签: java oracle hibernate hibernate-mapping

使用Hibernate 3.5.3:

在数据库中是一个函数(使用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;
}

我尝试创建一个Hibernate UserType,希望使用DateOptions中的ResultSet创建一个nullSafeGet(...)对象。

我在DateOptionsUserType

中指定了sql类型
public int[] sqlTypes() {
    return new int[] {Types.VARCHAR, Types.DATE}; 
}

我在启动时仍然遇到以下异常: org.hibernate.MappingException: property mapping has wrong number of columns: mypackage.MyEnity.dateOptions type: mypackage.DateOptionsUserType(我也尝试了CompositeUserType,结果相同)。

知道可能导致问题的原因是什么?它是否可能(将@Formula映射到自定义非实体对象)?

1 个答案:

答案 0 :(得分:0)

因为你基本上有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;