有没有办法将SQL参数的默认值设置为null?

问题描述

我有一个使用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_idparameters设置为null。有没有办法将account_iduser_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'

我使用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,USER_ID NUMBER(38,...

所以我的具体问题是,当我尝试使用参数运行测试而不将其设置为null时,我的测试给了我例外。

解决方法

使您的列可为空,并且在数据库模式中默认为null。然后,如果在插入时未为列指定值,则该列的默认值应为null

,

默认情况下,除非且直到您在插入或更新列时提供值,否则所有非null列的默认值均为NULL。

,

您必须包括addValue(ACCOUNT_ID,null)和addValue(USER_ID,null),因为您的INSERT语句包括两个命名参数:account_id:user_id

该框架尝试从MapSqlParameterSource对象中提取命名参数的值,当找不到其中一个参数时,它将引发异常。这样做是为了避免用户错误,因为如果您不打算为参数提供值,则不会在INSERT语句中包含该参数。