如何使用JDBCTemplate将空值插入外键

时间:2018-10-15 15:38:45

标签: java sql jdbc h2 jdbctemplate

我具有以下架构:

 <dependency>
     <groupId>my.group</groupId>
     <artifactId>my.group.artifact</artifactId>
     <version>1.8.6-SNAPSHOT</version>
     <exclusions>
         <exclusion>
             <groupId>org.eclipse.emf</groupId>
             <artifactId>org.eclipse.emf.common</artifactId>
         </exclusion>
     </exclusions>
 </dependency>

如果有api依赖项(例如子-父母关系),我的API实体本身会带有FK

我已经使用jdbc模板处理了CRUD部分(这意味着我避免使用休眠模式)。 当我的API是父级时,我遇到了一个问题,然后api_parent_id值应为null。

以下行(我跳过了无意义的列):

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

返回以下错误:

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

我应该如何处理null值? 我在指定

时尝试过使用MapSqlParameterSource或PreparedStatement
[90012-196]; nested exception is org.h2.jdbc.JdbcSQLException: Parameter "#1" is not set; SQL statement: update api set api_parent_id = ? where id = ?

2 个答案:

答案 0 :(得分:1)

  

ps.setNull(1,Types.NULL);

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

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

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

ps.setNull(1,Types.BIGINT);

答案 1 :(得分:0)

使用此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中为我工作。