假设我有以下形式的Oracle存储过程:
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 :(得分:0)
我认为您不能将实体直接映射到存储过程参数。 你必须逐个传递参数。
如果要调用存储过程,如果有Spring,请尝试:
我正在调用'rex_datainterface.getfieldtype'过程并传递2个参数:
存储过程的结果是
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");
}
}
}