我具有以下架构:
<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 = ?
答案 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中为我工作。