2011-01-18 21 views
6

Hola tengo un procedimiento almacenado de Oracle¿Cómo llamar al procedimiento almacenado por hibernación?

GET_VENDOR_STATUS_COUNT(DOCUMENT_ID IN NUMBER , NOT_INVITED OUT NUMBER,INVITE_WITHDRAWN OUT NUMBER,... 

resto todos los parámetros son parámetros OUT.

En HBM archivo que he escrito -

<sql-query name="getVendorStatus" callable="true"> 
    <return-scalar column="NOT_INVITED" type="string"/> 
    <return-scalar column="INVITE_WITHDRAWN" type="string"/> 
    <return-scalar column="INVITED" type="string"/> 
    <return-scalar column="DISQUALIFIED" type="string"/> 
    <return-scalar column="RESPONSE_AWAITED" type="string"/> 
    <return-scalar column="RESPONSE_IN_PROGRESS" type="string"/> 
    <return-scalar column="RESPONSE_RECEIVED" type="string"/> 
    { call GET_VENDOR_STATUS_COUNT(:DOCUMENT_ID , :NOT_INVITED ,:INVITE_WITHDRAWN ,:INVITED ,:DISQUALIFIED ,:RESPONSE_AWAITED ,:RESPONSE_IN_PROGRESS ,:RESPONSE_RECEIVED) } 
    </sql-query> 

en Java que han escrito -

session.getNamedQuery("getVendorStatus").setParameter("DOCUMENT_ID", "DOCUMENT_ID").setParameter("NOT_INVITED", "NOT_INVITED") 

... continuará hasta que todos los parametes.

estoy recibiendo la excepción de SQL

 
    18:29:33,056 WARN [JDBCExceptionReporter] SQL Error: 1006, SQLState: 72000 
    18:29:33,056 ERROR [JDBCExceptionReporter] ORA-01006: bind variable does not exist 

Por favor, que me haga saber lo que es el proceso exacto de llamar a un procedimiento almacenado de hibernación. No quiero usar la declaración invocable de JDBC.

+0

Consulte su [documento oficial] (http://docs.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/Hibernate_Core_Reference_Guide/sp_query.html) sobre el uso de procedimientos almacenados y limitaciones [aquí] (http : //docs.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/Hibernate_Core_Reference_Guide/sp_query.html) –

Respuesta

1

Con Hibernate debe aplicar una clase de resultado para transformar los resultados de SP en, y los nombres de las columnas que regresan deben tener un alias para los campos de devolución correctos en su clase de resultado. Hibernate quiere que los procesos almacenados de SQLServer tengan un solo resultado de retorno y quiere saber qué tipo de objeto crear. Donde trabajo generalmente devolvemos el resultado de una sola fila de dos columnas: return_code y message.

Por ejemplo ...

  • return_code = 404, message = "Página no encontrada"

  • return_code = 200, message = "OK"

La clase está mapeado como cualquier otro POJO, solo asegúrese de que sea serializable. Por ejemplo:

@Entity 
public class StoredProc implements Serializable { 

    private Integer returnCode; 
    private String message; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "return_code", nullable = false, unique = true) 
    public Integer getReturnCode() { 
    return returnCode; 
    } 
    public void setReturnCode(Integer returnCode) { 
    this.returnCode = returnCode; 
    } 

    @Column(name = "message") 
    public String getMessage() { 
    return message; 
    } 
    public void setMessage(String message) { 
    this.message = message; 
    } 

} 

También parece recordar algunos problemas generales con respecto a la convención de nomenclatura que utiliza Hibernate. Creo que names_with_underscores se traducen a camelCaseFieldNames, por ejemplo.

5

Lo que está intentando (manejo de parámetros INOUT/OUT) no es compatible con 4.1. A través de 4.1 el soporte de declaraciones invocables de Hibernate se enfoca en los retornos de ResultSet. Existe soporte para lo que está intentando implementar en maestro upstream y será parte de la próxima versión mayor de Hibernate (que será 4.2 o 5.0); allí, llamar funciones/procedimientos ahora es una operación de primera clase.

Por ahora, tiene que usar JDBC directamente o construir Hibernate desde el maestro y usar esa nueva compatibilidad. Si opta por la versión posterior, se vería así:

StoredProcedureCall call = session.createStoredProcedureCall("GET_VENDOR_STATUS_COUNT") 
     .registerStoredProcedureParameter("DOCUMENT_ID", Long.class, ParameterMode.IN) 
     .registerStoredProcedureParameter("NOT_INVITED", String.class, ParameterMode.OUT) 
     ...; 
call.getRegisteredParameter("DOCUMENT_ID").bindValue(theDocumentId); 
StoredProcedureOutputs outputs = call.getOutputs(); 
String notInvited = (String) outputs.getOutputParameterValue("NOT_INVITED"); 
... 

Ese código es aún joven y probablemente cambie.Por ejemplo, a medida que escribo estos ejemplos con más frecuencia, creo que registerStoredProcedureParameter debe renombrarse como registerParameter o declareParameter y que debe devolver una representación mecanografiada de la declaración/registro; algo así como:

interface RegisteredParameter<T> { 
    Class<T> getParameterType(); 
    // only valid for IN or INOUT params 
    void bindValue(T value); 
} 

<T> RegisteredParameter<T> registerParameter(String name, Class<T> type, ParameterMode mode); 

lo que permitiría:

StoredProcedureCall call = session.createStoredProcedureCall("GET_VENDOR_STATUS_COUNT") 
call.registerParameter("DOCUMENT_ID", Long.class, ParameterMode.IN).bindValue(theDocumentId); 
RegisteredParameter<String> notInvitedParam = call.registerParameter("NOT_INVITED", String.class, ParameterMode.OUT); 
... 
String notInvited = outputs.getOutputParameterValue(notInvitedParam); 

Como un beneficio adicional, las personas que tratan este antes de tiempo llegar a ayudar a formar el aspecto que tiene antes de ser puestos en libertad (en cuyo punto se es mucho más difícil de cambiar).

+0

Debo aclarar cuando digo que el manejo de parámetros INOUT/OUT no se admite actualmente. De hecho, puede tener parámetros INOUT/OUT, solo tienen que devolver ResultSets y solo puede tener un parámetro que devuelva los resultados por llamada. –

+0

Gracias por la información proporcionada en la respuesta, Parece que las funciones mencionadas están disponibles en la última versión de hibernación (4.3.6). Funciona perfectamente cuando el procedimiento almacenado devuelve un conjunto de resultados, pero hay varios conjuntos de resultados que presentan problemas. ¿Podría indicar la URL de la documentación de características anterior? No puedo encontrar en google –

Cuestiones relacionadas