Tengo un código que crea parámetros sql usando MapSqlParameterSource. Aquí está mi código:

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());
        }

Básicamente, si el tipo de cuenta es spoofer, debo tener una identificación de usuario en lugar de una identificación de cuenta. Sin embargo, no me gusta que tenga que configurar account_id y user_id en nulos cuando instalo parameters. ¿Hay alguna forma de establecer account_id y user_id como nulos para no tener que escribir estas dos líneas ?:

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

Aquí está mi consulta SQL:

INSERT INTO database (id, event_id, type, account_id, user_id)
    VALUES (database.nextval, :event_id, :type, :account_id, :user_id)

Actualizar:

Quizás mi pregunta no fue lo suficientemente específica. Lo que pasa es que cuando corro

jdbcTemplate.update(insertEventExtra, parameters);

Con los parámetros dados sin hacerlos "NULL", obtengo esta excepción en mi prueba unitaria:

org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter 'user_id': No value registered for key 'user_id'

Utilizo hsql para probarlo. mi .sql se ve así:

...
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),
...

Entonces, mi pregunta específica es que mi prueba me está dando una excepción cuando intento ejecutar una prueba con parámetros sin establecerlos en nulos.

0
Jonathan Hagen 21 ago. 2020 a las 21:21

3 respuestas

La mejor respuesta

Debe incluir addValue (ACCOUNT_ID, null) y addValue (USER_ID, null) porque su declaración INSERT incluye los dos parámetros con nombre :account_id, :user_id.

El marco intenta extraer los valores para los parámetros nombrados del objeto MapSqlParameterSource y cuando no encuentra uno de ellos, lanza la excepción. Hace esto para evitar errores del usuario, porque si no pretendiera proporcionar un valor para un parámetro, no incluiría el parámetro en la instrucción INSERT.

1
fredt 24 ago. 2020 a las 18:56

Haga que sus columnas sean anulables y de forma predeterminada nulas en el esquema de la base de datos. Luego, si no especifica un valor para una columna al insertar, debería ser nulo por defecto

1
AndreiXwe 21 ago. 2020 a las 18:24

De forma predeterminada, todas las columnas no nulas tienen un valor predeterminado de NULL a menos que y hasta que proporcione un valor al insertar o actualizar la columna.

1
mohd atif 21 ago. 2020 a las 18:40