有什么方法可以从NamedParameterJdbcTemplate返回Optional吗?
我的查询有时可以返回空。所以我想用美丽的方法检查是否有空。我不想做这个丑陋的尝试抓住EmptyResultDataAccessException因为。
答案 0 :(得分:0)
据我了解,您的问题似乎是您的ResultSet
有时可能完全为空,因此,返回值不是null
而是首先没有任何结果,因此,为什么您提到EmptyResultDataAccessException
。
在我的回答中,我将假设您仅对第一个结果感兴趣,否则将没有任何意义。
NamedParameterJdbcTemplate
中没有直接方法,但是您可以使用lambda到达那里。具体来说,您可以获取所有结果的列表,然后使用stream().findAny()
获得Optional
。
或多或少,它会像这样:
Optional<Integer> values = namedParameterJdbcTemplate.queryForList(...)
.stream()
.map(m -> (Integer)m.get("MY_COLUMN"))
.findAny();
在执行上述操作时,您可能希望限制查询将要返回的结果数,否则可能会给网络以及服务器的内存造成过多压力。根据数据库技术的不同,有类似LIMIT
和OFFSET
的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(...));