Java Hibernate-将实体作为参数传递给SQL查询

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

假设我有一个以下形式的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, :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(“结果”);
}
}
}