Как вставить нулевое значение во внешний ключ с помощью JDBCTemplate - PullRequest
0 голосов
/ 15 октября 2018

У меня есть следующая схема:

CREATE TABLE API
(
ID BIGINT NOT NULL,
NAME VARCHAR NOT NULL,
API_PARENT_ID BIGINT,
CONSTRAINT API_PKEY PRIMARY KEY (ID)
CONSTRAINT API_PARENT_ID_FKEY FOREIGN KEY (API_PARENT_ID) references API,
);

Моя сущность API имеет FK на себе в случае API-зависимостей (например, отношения потомок-родитель)

Я справляюсь сам(то есть я избегал использовать hibernate) часть CRUD с шаблоном jdbc.Я столкнулся с проблемой, когда мой API является родительским, и тогда значение api_parent_id должно быть нулевым.

Следующая строка (я пропустил бессмысленные столбцы):

String _SQL_UPDATE_API = "update api set api_parent_id = ? where id = ?"
this.jdbcTemplate.update(_SQL_UPDATE_API, api.getParent !=null ? api.getParent().getId() : null , api.getId());

returnследующая ошибка:

[90012-196]; nested exception is org.h2.jdbc.JdbcSQLException: Parameter "#1" is not set; SQL statement: update api set api_parent_id = ? where id = ?

Как мне обработать нулевое значение?Я пытался с MapSqlParameterSource или с PreparedStatement в указании

ps.setNull(1,Types.NULL); 

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Передайте аргумент вместе с типом аргументов, используя эту функцию update .

Integer id = 1
Integer parent_id = null

String _SQL_UPDATE_API = "update api set api_parent_id = ? where id = ?";

java.lang.Object[] args = [parent_id, id]
int[] argTypes   = [java.sql.Types.BIGINT, java.sql.Types.BIGINT]

updCnt = jdbcTemplate.update(_SQL_UPDATE_API, args, argTypes);

Примечание. Это синтаксис Groovy, поэтому при необходимости настройте его на Java.

Работал у меня в Oracle 12.

0 голосов
/ 15 октября 2018

ps.setNull (1, Types.NULL);

К сожалению, вам нужно будет указать конкретный тип JDBC столбца, который соответствует типу столбца,в соответствии с вашим драйвером JDBC.

Некоторые драйверы JDBC более требовательны, чем другие.Я предполагаю, что H2 нуждается в определенном типе.

В этом случае используйте Types.BIGINT, например:

ps.setNull(1,Types.BIGINT);
...