NamedParameterJdbcTemplate return可选的<Integer>

时间:2019-12-13 08:18:11

标签: java spring jdbctemplate

有什么方法可以从NamedParameterJdbcTemplate返回Optional吗?

我的查询有时可以返回空。所以我想用美丽的方法检查是否有空。我不想做这个丑陋的尝试抓住EmptyResultDataAccessException因为。

1 个答案:

答案 0 :(得分:0)

据我了解,您的问题似乎是您的ResultSet有时可能完全为空,因此,返回值不是null而是首先没有任何结果,因此,为什么您提到EmptyResultDataAccessException。 在我的回答中,我将假设您仅对第一个结果感兴趣,否则将没有任何意义。

NamedParameterJdbcTemplate中没有直接方法,但是您可以使用lambda到达那里。具体来说,您可以获取所有结果的列表,然后使用stream().findAny()获得Optional

或多或少,它会像这样:

Optional<Integer> values = namedParameterJdbcTemplate.queryForList(...)
    .stream()
    .map(m -> (Integer)m.get("MY_COLUMN"))
    .findAny();

在执行上述操作时,您可能希望限制查询将要返回的结果数,否则可能会给网络以及服务器的内存造成过多压力。根据数据库技术的不同,有类似LIMITOFFSET的SQL子句(有关Postgres的信息,请参见https://www.postgresql.org/docs/8.1/queries-limit.html;对于MySQL的信息,请参见https://dev.mysql.com/doc/refman/5.5/en/limit-optimization.html),以帮助您完成任务。

但是请注意,如果您的查询首先返回多个行,则实际上是在丢弃一些数据,因此,假设您首先做错了(可能是更安全的做法),换句话说:您必须确保查询将始终返回零或一个结果。


相反,假设您始终只具有一行和一列,但返回值为null,则获得Optional的最简单方法是将调用包装在Optional.ofNullable中。 示例(伪代码,仅是要点):

Optional<Integer> v = Optional<Integer>.ofNullable(namedParameterJdbcTemplate.queryForObject(...));