2015-06-04 111 views
2

當我傳入基本的java對象(String,Long等)時,存儲過程正常工作,但我似乎無法在我自己的實體/對象中傳遞而沒有出現以下錯誤:JPA EclipseLink自定義實體/對象作爲IN參數

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException 
Internal Exception: java.sql.SQLException: Invalid column type 
Error Code: 17004 
Call: BEGIN sar_ops.input_rule_no_response(operation_id_in=>?, executing_usr_id_in=>?, rule_obj_in=>?, success_ind_out=>?, error_cur_out=>?); END; 
    bind => [MO1234ABCD, TEST, Rule [id=99999, last_updated_by=mike], => success_ind_out, => error_cur_out] 
Query: ResultSetMappingQuery(name="input_rule_no_response") 

從閱讀起,我以爲我的代碼可以工作(見下文)。我添加了@Struct註解,並從數據庫中爲它提供了匹配的oracle對象的名稱。我受到eclispelink文檔的印象,我只需要在我的類上使用@Embeddable和@Struct註釋,但是我也在測試理論時添加了@Entity註釋,但仍然得到相同的錯誤。我覺得我必須錯過eclipselink的某種形式的配置,才能知道傳入的對象是它期望的Oracle對象的Java類表示。

Oracle對象和存儲過程的定義:

PROCEDURE input_rule_no_response 
    (
     operation_id_in  IN operation_id_type 
    ,executing_usr_id_in IN usr_id%TYPE 
    ,rule_obj_in   IN rule_obj_type 
    ,success_ind_out  OUT uttype.boolean_type 
    ,error_cur_out  OUT SYS_REFCURSOR 
    ) IS 
... 

CREATE OR REPLACE TYPE rule_obj_type AS OBJECT 
(
    id     NUMBER(10), 
    last_updated_by  VARCHAR2(100) 
) 

我的存儲過程被定義爲:

@NamedStoredProcedureQuery(
     name="input_rule_no_response", 
     resultClasses={DBError.class, Rule.class}, 
     procedureName="sar_ops.input_rule_no_response", 
     parameters={ 
       @StoredProcedureParameter(name="operation_id_in", mode=ParameterMode.IN, type=String.class), 
       @StoredProcedureParameter(name="executing_usr_id_in", mode=ParameterMode.IN, type=String.class), 
       @StoredProcedureParameter(name="rule_obj_in", mode=ParameterMode.IN, type=Rule.class), 
       @StoredProcedureParameter(name="success_ind_out", mode=ParameterMode.OUT, type=Character.class), 
       @StoredProcedureParameter(name="error_cur_out", mode=ParameterMode.REF_CURSOR, type=void.class) 
}) 

我的實體的樣子:

@Embeddable 
@Entity 
@Struct(name="rule_obj_type", fields={"id","last_updated_by"}) 
public class Rule implements Serializable{ 

    private static final long serialVersionUID = 4768354320081279604L; 

    @Id 
    @Column(name="id") 
    private long id; 

    @Column(name="last_updated_by") 
    private String last_updated_by; 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getLast_updated_by() { 
     return last_updated_by; 
    } 

    public void setLast_updated_by(String last_updated_by) { 
     this.last_updated_by = last_updated_by; 
    } 

    @Override 
    public String toString() { 
     return "Rule [id=" + id + ", last_updated_by=" 
       + last_updated_by + "]"; 
    } 
} 

而且我執行的代碼:

public boolean inputRuleNoResponse(Rule sar) { 
     StoredProcedureQuery query = em.createNamedStoredProcedureQuery("input_rule_no_response"); 
     query.setParameter("operation_id_in", "MO1234ABCD"); 
     query.setParameter("executing_usr_id_in", "TEST"); 
     query.setParameter("rule_obj_in", sar); 
     return query.execute(); 
} 
+1

StoredProcedureParameter類型用於在數據庫值需要轉換爲java時指定您想返回的java類型。我想你錯過了jdbcType和JdbcTypeName http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_storedprocedureparameter.htm – Chris

+0

謝謝,添加jdbcType和JdbcTypeName的工作,我現在能夠獲取對象並保存正確...下一步是讓他們再次退出。 – Craig

回答

1

答案是將Chris提供的JdbcType和JdbcTypeName添加到存儲過程配置中。

+2

你能否展示你的解決方案? – rbellamy

相關問題