有没有办法将 SQL 参数的默认值设置为 null?
Is there way to set default as null for SQL parameter?
我有一个使用 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。但是,我不喜欢在实例化 parameters
时必须将 account_id
和 user_id
设置为空。有没有办法将 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 时,我的测试给了我异常。
使您的列可以为 null,并在数据库架构中默认为 null。然后,如果你在插入时没有为列指定值,它应该默认为 null
默认情况下,所有非空列的默认值为 NULL,除非您在插入或更新列时提供值。
您必须包括 addValue(ACCOUNT_ID, null) 和 addValue(USER_ID, null) 因为您的 INSERT 语句包括两个命名参数 :account_id
, :user_id
.
框架尝试从 MapSqlParameterSource
对象中提取指定参数的值,当找不到其中之一时,它会抛出异常。它这样做是为了避免用户错误,因为如果您不打算为参数提供值,则不会在 INSERT 语句中包含该参数。
我有一个使用 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。但是,我不喜欢在实例化 parameters
时必须将 account_id
和 user_id
设置为空。有没有办法将 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 时,我的测试给了我异常。
使您的列可以为 null,并在数据库架构中默认为 null。然后,如果你在插入时没有为列指定值,它应该默认为 null
默认情况下,所有非空列的默认值为 NULL,除非您在插入或更新列时提供值。
您必须包括 addValue(ACCOUNT_ID, null) 和 addValue(USER_ID, null) 因为您的 INSERT 语句包括两个命名参数 :account_id
, :user_id
.
框架尝试从 MapSqlParameterSource
对象中提取指定参数的值,当找不到其中之一时,它会抛出异常。它这样做是为了避免用户错误,因为如果您不打算为参数提供值,则不会在 INSERT 语句中包含该参数。