问题描述
我有一个使用MapsqlParameterSource创建sql参数的代码。这是我的代码:
MapsqlParameterSource parameters = new MapsqlParameterSource()
.addValue(EVENT_ID,eventId)
.addValue(TYPE,type.toString())
.addValue(ACCOUNT_ID,null)
.addValue(USER_ID,null);
if (Type.SPOOFER_USER == type) {
parameters.addValue(USER_ID,account.getUser().getId());
}
else {
parameters.addValue(ACCOUNT_ID,account.getId());
}
基本上,如果帐户类型为欺骗者,则必须使用用户ID而不是帐户ID。但是,我不喜欢在实例化account_id
时必须将user_id
和parameters
设置为null。有没有办法将account_id
和user_id
设置为null,这样我就不必写这两行了:
MapsqlParameterSource parameters = new MapsqlParameterSource()
.addValue(EVENT_ID,null) //////////////////////////THIS ONE
.addValue(USER_ID,null); //////////////////////////AND THIS ONE
这是我的SQL查询:
INSERT INTO database (id,event_id,type,account_id,user_id)
VALUES (database.nextval,:event_id,:type,:account_id,:user_id)
更新:
也许我的问题不够具体。发生了什么事,当我跑步
jdbcTemplate.update(insertEventExtra,parameters);
使用给定的参数而不将其设置为“ NULL”,我在单元测试中得到了此异常:
org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the sql parameter 'user_id': No value registered for key 'user_id'
...
ID NUMBER(38,0) PRIMARY KEY,EVENT_ID BIGINT NOT NULL,TYPE VARCHAR2(20 BYTE) NOT NULL,ACCOUNT_ID NUMBER(38,0),GROUP_ID NUMBER(38,USER_ID NUMBER(38,...
所以我的具体问题是,当我尝试使用参数运行测试而不将其设置为null时,我的测试给了我例外。
解决方法
使您的列可为空,并且在数据库模式中默认为null。然后,如果在插入时未为列指定值,则该列的默认值应为null
,默认情况下,除非且直到您在插入或更新列时提供值,否则所有非null列的默认值均为NULL。
,您必须包括addValue(ACCOUNT_ID,null)和addValue(USER_ID,null),因为您的INSERT语句包括两个命名参数:account_id
,:user_id
。
该框架尝试从MapSqlParameterSource
对象中提取命名参数的值,当找不到其中一个参数时,它将引发异常。这样做是为了避免用户错误,因为如果您不打算为参数提供值,则不会在INSERT语句中包含该参数。