微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

可能的空参数的preparedStatement

如何解决可能的空参数的preparedStatement

我在 kotlin 中有一个函数,我很好奇是否有办法让它看起来更“干净”?

我有可能为空/可选的参数

override fun readByOrderId(orderId: Int,eventType: EventType?,version: Int?): OrderDomain? {
        var sql = "SELECT * FROM Orders WHERE id=?"
        if(eventType != null)
        {
            sql += " AND eventType=?"
        }

        if(version != null)
        {
            sql += " AND version=?"
        }

        val result: MutableList<OrderDomain> = jdbcTemplate.query<OrderDomain>(
            sql,PreparedStatementSetter { preparedStatement -> preparedStatement.setInt(1,orderId)
                preparedStatement.setString(2,eventType.toString())
                preparedStatement.setInt(3,version},RowMapper { rs: ResultSet,rowNum: Int ->
                OrderDomain(
                    rs.getLong(DataColumn.EVENT_ID.toString()),)
            }
        )
    }

但是,preparedStatement 的放置可能是一个问题,而 toString 可能会抛出 NPE……我可以调整 PreparedStatement 中的任何内容,因为两个空字段是可选字段?

解决方法

这就是我有条件地将适当的参数添加到语句并保持索引有序的方式。

PreparedStatementSetter { it.apply {
    var index = 1
    setInt(index++,orderId)
    if (eventType != null) {
        setString(index++,eventType.toString())
    }
    if (version != null) {
        setInt(index++,version)
    }
} }
,

null.toString() 在 Kotlin doesn't throw NPE 中,它返回字符串“null”。

为了避免显式参数索引声明,我建议将所有参数放在一个列表中(以便它们在列表中的顺序与它们在查询中的顺序相匹配)并使用 setObject 方法(因此所有类型的参数可以用普通的方式处理):

PreparedStatementSetter {
    val params = listOfNotNull(
        orderId,eventType.toString().takeIf { eventType != null },version
    )
    params.forEachIndexed { index,param -> it.setObject(index + 1,param) }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。