我有一个使用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
当我示例化时为null parameters
. 有没有什么办法 account_id
以及 user_id
为空,这样我就不用写这两行了
MapSqlParameterSource parameters = new MapSqlParameterSource()
.addValue(EVENT_ID, eventId)
.addValue(TYPE, type.toString())
.addValue(ACCOUNT_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'
我用hsql来测试它。我的.sql如下所示:
...
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,0),
USER_ID NUMBER(38,0),
...
所以我的具体问题是,当我尝试运行带有参数的测试而不将其设置为null时,我的测试会给我异常。
3条答案
按热度按时间nr9pn0ug1#
默认情况下,除非在插入或更新列时提供值,否则所有not null列的默认值都为null。
xpcnnkqh2#
在数据库架构中,使列可以为null并默认为null。然后,如果在插入时没有为列指定值,则它应该默认为null
6ss1mwsb3#
必须包含addvalue(account\u id,null)和addvalue(user\u id,null),因为insert语句包含两个命名参数
:account_id
,:user_id
.框架尝试从
MapSqlParameterSource
对象,当它找不到其中一个时,它抛出异常。它这样做是为了避免用户错误,因为如果不想为参数提供值,就不会在insert语句中包含该参数。