我正在使用带有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)
}
}
所有方法都需要非可空类型。
答案 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()
,可能不需要这个。