2011-12-23 90 views
1

假设我有以下形式的Oracle存储过程:休眠 - 传递一个实体作为参数传递给一个SQL查询

procedure validate_entity1(p_id number, p_property1 varchar2, p_property2 varchar2); 

我需要从我的Java应用程序中调用它,所以我做了一个sql-query像这个:

<sql-query name="q1" callable="true"> 
    <!-- . . . --> 
    { call validate_entity1(:id, :property1, :property2) } 
</sql-query> 

然后我创建这个查询并手动绑定所有这些属性。我真正想要做的是绑定整个实体,像这样:

session.createNamedQuery("q1").setEntity("entity1", myEntity1); 

但它不起作用。以某种方式可以做到这一点吗?

回答

0

我不认为你可以将实体直接映射到存储过程参数。 您必须逐个传递参数。

如果要调用存储过程,如果你有春天,试试这个:

我调用过程“rex_datainterface.getfieldtype”,我经过2个参数:

  • recoType( NUMBER)IN。
  • 结果(CURSOR)OUT。

存储过程的结果是一个

List<RecordsetDTO> 

这里是代码:

@Component 
    public class RexFieldTypeDAO { 

    @Resource(name = "REXDataSource") 
    private DataSource lyxsrvREXDataSource; 

// ------------------------------------------------------------------------ 

public RexFieldTypeDAO() { 
} 

// ------------------------------------------------------------------------ 

public RecordSetDTO getFieldTypes(int recoType) { 
    RecordSetDTO res; 

    GetFieldTypeStoredProcedure proc = new GetFieldTypeStoredProcedure(lyxsrvREXDataSource); 
    res = proc.execute(recoType); 

    return res; 
} 

/** 
* Private class used to access Stored Procedure. 
*/ 
private static class GetFieldTypeStoredProcedure extends StoredProcedure { 
    private static final String SQL = "rex_datainterface.getfieldtype"; 

    public GetFieldTypeStoredProcedure(DataSource dataSource) { 
     super(dataSource, SQL); 
     setFunction(true); 
     declareParameter(new SqlOutParameter("result", OracleTypes.CURSOR, new RecordSetDTORowMapper())); 
     declareParameter(new SqlParameter("recoType", OracleTypes.NUMBER)); 
     compile(); 
    } 

    public List<RecordSetDTO> execute(int recoType) { 
     Map<String, Object> inputs = new HashMap<String, Object>(); 

     inputs.put("recoType", recoType); 
     return (List<RecordSetDTO>)super.execute(inputs).get("result"); 
    } 

} 

}