Java Hibernate-将实体作为参数传递给SQL查询
假设我有一个以下形式的Oracle存储过程:Java Hibernate-将实体作为参数传递给SQL查询,java,hibernate,Java,Hibernate,假设我有一个以下形式的Oracle存储过程: procedure validate_entity1(p_id number, p_property1 varchar2, p_property2 varchar2); 我需要从我的Java应用程序调用它,所以我做了一个sql查询,如下所示: <sql-query name="q1" callable="true"> <!-- . . . --> { call validate_entity1(:id, :p
procedure validate_entity1(p_id number, p_property1 varchar2, p_property2 varchar2);
我需要从我的Java应用程序调用它,所以我做了一个sql查询
,如下所示:
<sql-query name="q1" callable="true">
<!-- . . . -->
{ call validate_entity1(:id, :property1, :property2) }
</sql-query>
session.createNamedQuery("q1").setEntity("entity1", myEntity1);
但它不起作用。有可能以某种方式做到这一点吗?我认为不能将实体直接映射到存储过程参数。 您必须逐个传递参数 如果要调用存储过程,并且使用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");
}
}
@组件
公共类RexFieldTypeDAO{
@资源(name=“REXDataSource”)
私有数据源lyxsrvREXDataSource;
// ------------------------------------------------------------------------
公共字段类型dao(){
}
// ------------------------------------------------------------------------
公共记录设置为getFieldTypes(int recoType){
记录到res;
GetFieldTypeStoredProcedure proc=新的GetFieldTypeStoredProcedure(lyxsrvREXDataSource);
res=过程执行(recoType);
返回res;
}
/**
*用于访问存储过程的私有类。
*/
私有静态类GetFieldTypeStoredProcess扩展StoredProcess{
私有静态最终字符串SQL=“rex\u datainterface.getfieldtype”;
公共GetFieldTypeStoredProcess(数据源数据源){
super(数据源,SQL);
setFunction(真);
declareParameter(新的SqlOutParameter(“result”,OracleTypes.CURSOR,新的recordsetdtorowapper());
declareParameter(新的SqlParameter(“recoType”,OracleTypes.NUMBER));
编译();
}
公共列表执行(int recoType){
映射输入=新的HashMap();
输入。输入(“recoType”,recoType);
返回(列表)super.execute(输入).get(“结果”);
}
}
}