Java 如何使用JDBCTemplate向外键插入空值

Java 如何使用JDBCTemplate向外键插入空值,java,sql,jdbc,h2,jdbctemplate,Java,Sql,Jdbc,H2,Jdbctemplate,我有以下模式: 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依赖关系(如子-父关系),则我的API实体本身有一个FK 我已经用jdb

我有以下模式:

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依赖关系(如子-父关系),则我的API实体本身有一个FK

我已经用jdbc模板处理了CRUD部分(这意味着我已经避免使用hibernate)。 我遇到了一个问题,当我的API是父API时,那么API\u parent\u id值应该为null

下一行(我跳过了没有意义的列):

返回以下错误:

[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); 
ps.setNull(1,Types.NULL)

不幸的是,您需要根据JDBC驱动程序设置与列类型对应的列的特定JDBC类型

一些JDBC驱动程序比其他驱动程序更挑剔。我想H2需要特定的类型

在这种情况下,请使用
Types.BIGINT
,如下所示:

ps.setNull(1,Types.BIGINT);

使用此函数将参数与参数类型一起传递

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中为my工作。

我已经尝试过此解决方案,但H2使用0值转换集合null,该值与我的表中的某个值不对应,因为它是FKWell。最后,此方法成功了,我对实体的提取数据有问题,默认情况下,它在我的实体上映射了一个新的APIPParent,然后我的更新总是不为null并发送0..我也尝试过这个解决方案,但现在我遇到了这个错误:org.springframework.dao.DataIntegrityViolationException:PreparedStatementCallback;SQL[更新api集api_父项_id=?其中id=?];数据转换错误转换“(-5,-5)”好吧,如果一切都失败了,我会为
NULL
案例使用一个额外的语句:
updateapi set api\u parent\u id=NULL,其中id=?
好吧,这个解决方案将不起作用,因为parent\u id不会始终为NULL。您将使用
if(parent\u id!=NULL)然后
您的原始语句,并且仅在
else
中修改此语句。
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);