Spring NamedParameterJdbcTemplate无法使用Kotlin插入NULL

时间:2018-04-10 18:20:48

标签: spring kotlin spring-jdbc

我正在使用带有Spring Boot 2的Kotlin。我只是在做一个简单的插入,其字段可能是,也可能不是null。但是在Kotlin中,使用MapSqlParameterSource似乎不可能,因为.addValue方法不接受null或nullable类型。这很不寻常,因为insert NULL可以是一个有效的用例。过去,Java和Spring Boot非常简单易用。有没有办法解决这个问题,我真的不想通过箍来做一些简单直接的事情。

@Transactional
fun saveSubmittedAnswer(answer: AnswerSubmissionRequest) {

    val query = """INSERT INTO dab.SubmittedAnswer (Id, QuestionId, Answer, SurveyId, ParentQuestionId, TimeTaken
        | VALUES (:id, :questionId, :answer, :surveyId, :parentQuestionId, :timeTaken)
    """.trimMargin()

    answer.answers.forEach { ans ->
        val params: MapSqlParameterSource = MapSqlParameterSource()
                .addValue("id", UUID.randomUUID())
                .addValue("questionId", ans.questionId)
                .addValue("answer", ans.answer)
                .addValue("surveyId", answer.surveyId)
                //.addValue("parentQuestionId", ans.parentId)
                .addValue("timeTaken", ans.timeTaken)

        this.jdbcTemplate.update(query, params)
    }
}

所有方法都需要非可空类型。

enter image description here

1 个答案:

答案 0 :(得分:3)

MapSqlParameterSource存在的原因是因为Java没有提供创建事物映射的优雅方法。由于我们可以在Kotlin中使用mapOf(),因此我们可能根本不需要MapSqlParameterSource

如果是我,我宁愿使用mapOf()并完全避免MapSqlParameterSource

val params = mapOf(
    "id" to UUID.randomUUID(),
    "questionId" to ans.questionId,
    "answer" to ans.answer,
    "surveyId" to answer.surveyId,
    "parentQuestionId" to ans.parentId,
    "timeTaken" to ans.timeTaken
)
jdbcTemplate.update(query, params)

但是,我同意这似乎是API的疏忽。可能会引入可注释性注释以使Kotlin用户的生活更轻松。

这似乎是为我编译的,但我只是在IDE中尝试过,并没有运行它:

MapSqlParameterSource()
   .addValue("notNullable", myObject.notNulableValue)
   .addValues(mapOf("nullable" to myObject.nullableValue))

这是有效的,因为addValues函数需要Map<String, ?>(有趣的是,@ Nullable)。

我猜这是一个错误,无意中在this commit中引入。但同样,我们有mapOf(),可能不需要这个。