2011-01-18 36 views
6

Hi Tôi có một lời sấm được lưu trữ thủ tụcLàm thế nào để gọi thủ tục lưu trữ bằng ngủ đông?

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

còn lại tất cả các thông số OUT thông số.

Trong file hbm Tôi đã viết -

<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> 

Trong java Tôi đã viết -

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

... tiếp tục cho đến khi tất cả các parametes.

Tôi nhận được ngoại lệ 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 

Xin vui lòng cho tôi biết quá trình chính xác của cách gọi một thủ tục lưu trữ từ ngủ đông là gì. Tôi không muốn sử dụng câu lệnh có thể gọi JDBC.

+0

Tham khảo [tài liệu chính thức] của họ (http://docs.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/Hibernate_Core_Reference_Guide/sp_query.html) về cách sử dụng các thủ tục và giới hạn được lưu trữ [tại đây] (http : //docs.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/Hibernate_Core_Reference_Guide/sp_query.html) –

Trả lời

1

Với Hibernate bạn phải áp dụng một lớp kết quả để chuyển đổi kết quả SP thành và tên của các cột trả về phải được đặt bí danh cho các trường trả về chính xác trong lớp kết quả của bạn. Hibernate muốn SQLServer lưu trữ procs để có một kết quả trả về duy nhất và nó muốn biết loại Object nào để tạo ra. Nơi tôi làm việc, chúng tôi thường trả về một kết quả hàng đơn của hai cột: return_code và tin nhắn.

Ví dụ ...

  • return_code = 404, message = "Page not found"

  • return_code = 200, message = "OK"

Lớp được ánh xạ giống như bất kỳ POJO nào khác, chỉ cần đảm bảo làm cho nó có thể nối tiếp được. Ví dụ:

@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; 
    } 

} 

Tôi cũng có vẻ nhớ lại một số điểm chung chung liên quan đến quy ước đặt tên sử dụng Hibernate. Tôi nghĩ names_with_underscores được dịch sang camelCaseFieldNames chẳng hạn.

5

Điều bạn đang cố gắng (xử lý thông số INOUT/OUT) không được hỗ trợ trong 4.1. Thông qua 4.1 hỗ trợ báo cáo có thể gọi của Hibernate tập trung vào kết quả ResultSet. Có hỗ trợ cho những gì bạn đang cố gắng tại chỗ trên thượng nguồn tổng thể và sẽ là một phần của bản phát hành lớn tiếp theo của Hibernate (sẽ là 4.2 hoặc 5.0); ở đó, các chức năng/thủ tục gọi hiện giờ là một hoạt động hạng nhất.

Hiện tại, bạn phải sử dụng JDBC trực tiếp hoặc xây dựng Hibernate từ chính và sử dụng hỗ trợ mới đó. Nếu bạn chọn tham gia sau này, giao diện sẽ trông giống như sau:

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"); 
... 

Mã đó vẫn còn trẻ và có thể sẽ thay đổi.Ví dụ, khi tôi viết những ví dụ này thường xuyên hơn, tôi nghĩ rằng registerStoredProcedureParameter nên được đổi tên thành registerParameter hoặc declareParameter và rằng nó sẽ trả về một biểu diễn đã nhập của việc khai báo/đăng ký; cái gì đó như:

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); 

mà sau đó sẽ cho phép:

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); 

Là một tiền thưởng thêm, mọi người cố gắng này sớm có được để giúp hình thành những gì này trông giống như trước khi nó được phát hành (lúc này nó khó thay đổi hơn nhiều).

+0

Tôi nên làm rõ khi tôi nói về xử lý thông số INOUT/OUT hiện không được hỗ trợ. Bạn có thể có các tham số INOUT/OUT, chúng chỉ cần trả về ResultSets và bạn chỉ có thể có một tham số trả về kết quả cho mỗi cuộc gọi. –

+0

Cảm ơn thông tin được cung cấp trong câu trả lời, Có vẻ như các tính năng được đề cập ở trên có sẵn trên phiên bản ngủ đông mới nhất (4.3.6). Nó hoạt động hoàn hảo khi thủ tục lưu trữ trả về một kết quả, nhưng nhiều tập kết quả có vấn đề, bạn có thể vui lòng chỉ ra URL cho các tài liệu tính năng ở trên. Tôi không thể tìm thấy trên google. –

Các vấn đề liên quan