Spring StoredProcedure 可选参数
Posted
技术标签:
【中文标题】Spring StoredProcedure 可选参数【英文标题】:Spring StoredProcedure Optional Parameters 【发布时间】:2012-09-13 02:20:01 【问题描述】:我在 Oracle 中有一个过程,它总共有 12 个参数和 3 个可选参数。如果我在 Spring 3.1.0 中使用 StoredProcedure 对象,如何考虑这些可选参数?
这是我的 StoredProcedure 类中的内容
public Map<String, Object> execute(Evaluation evaluation)
Map<String, Object> input_params = new HashMap<String, Object>();
input_params.put(COURSE_MAIN_PK1_INPUT_PARAM, evaluation.getCourseId());
input_params.put(USERS_PK1_INPUT_PARAM, evaluation.getUsersPk1());
input_params.put(ACCREDITATION_PK1_INPUT_PARAM, evaluation.getAccreditationPk1());
input_params.put(TYPE_PK1_INPUT_PARAM, evaluation.getTypePk1());
input_params.put(PRIVACY_TYPE_PK1_INPUT_PARAM, evaluation.getPrivacyTypePk1());
input_params.put(FORM_TYPE_PK1_INPUT_PARAM, evaluation.getFormTypePk1());
input_params.put(TITLE_INPUT_PARAM, evaluation.getTitle());
input_params.put(DESCRIPTION_INPUT_PARAM, evaluation.getDescription());
if(evaluation.getStartDate() != null)
input_params.put(START_DATE_INPUT_PARAM, new java.sql.Date(evaluation.getStartDate().getMillis()));
if(evaluation.getEndDate() != null)
input_params.put(END_DATE_INPUT_PARAM, new java.sql.Date(evaluation.getEndDate().getMillis()));
input_params.put(SAVE_TO_GRADECENTER_INPUT_PARAM, evaluation.getGradeCenterColumn());
input_params.put(CREATE_ANNOUNCEMENT_INPUT_PARAM, evaluation.getAnnouncement());
return super.execute(input_params);
问题在于我提供了 12 个参数,如果开始日期和结束日期为空,现在我提供 10 个参数并获得异常。
数据库中日期的默认值为null
。
【问题讨论】:
由于Map
可以包含 null
值,您是否尝试始终将 startDate 和 endDate 键添加到映射中,并查看存储过程在日期为 null 和非空?
是的,当有一个日期时,它运行良好,但问题是当提供给java.sql.Date
构造函数的evaluation.getStartDate().getMillis()
返回一个空值时,我得到一个NullPointerException
。所以我想要做的是不提供参数,如果它是空的,而是让过程插入默认值(空)。
我的意思是如果evaluation.getStartDate() == null
,那么试试input_params.put(START_DATE_INPUT_PARAM, null)
。 evaluation.getEndDate == null
也是如此。
成功了!如果在 cmets 中,我不知道如何接受你的答案??
我在下面的答案中添加了为什么你应该这样做的解释。
【参考方案1】:
JDBC 的PreparedStatement
提供了一种使用setNull
方法为参数设置空值的工具。因此,只要您将所有参数传递给存储过程(如果它们为空),Spring 就可以准备语句并执行它。
因此,您需要将值为 null 的输入参数添加到发送到存储过程调用的 Map 中。
input_params.put(START_DATE_INPUT_PARAM,
(null != evaluation.getStartDate()
? new java.sql.Date(evaluation.getStartDate().getMillis())
: null));
这同样适用于 END_DATE_INPUT_PARAM。
【讨论】:
以上是关于Spring StoredProcedure 可选参数的主要内容,如果未能解决你的问题,请参考以下文章
Java Spring JDBC 调用存储过程(Stored Procedure) 输入(In)输出(Out)参数
带有可选参数的 Spring @RequestMapping