當我傳入基本的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();
}
StoredProcedureParameter類型用於在數據庫值需要轉換爲java時指定您想返回的java類型。我想你錯過了jdbcType和JdbcTypeName http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_storedprocedureparameter.htm – Chris
謝謝,添加jdbcType和JdbcTypeName的工作,我現在能夠獲取對象並保存正確...下一步是讓他們再次退出。 – Craig