Spring JDBC:返回 0 或 1 行

Posted

技术标签:

【中文标题】Spring JDBC:返回 0 或 1 行【英文标题】:Spring JDBC: Returning 0 or 1 rows 【发布时间】:2016-10-07 18:22:43 【问题描述】:

我试图用谷歌搜索这个问题,但找不到:Spring jdbcTemplate 中是否有推荐的方法,当我们期望返回 0 或 1 行时应该使用该方法。当没有返回行时,queryForObject() 将抛出异常。 queryForList() 将需要遍历列表,但这不是问题。但我很好奇是否有返回 0 或 1 行的首选/推荐方法。谢谢!

【问题讨论】:

【参考方案1】:

DataAccessUtils.singleResult(jdbcTemplate.queryForList(...));

我相信这正是针对这些情况而设计的。如果集合为空,则 will 返回 null,如果找到超过 1 个元素,则抛出 IncorrectResultSizeDataAccessException

【讨论】:

我想知道为什么spring jdbc没有解决这个问题..设计差距..【参考方案2】:

您列出的选项是唯一可用的。至少在 Spring 支持 Optional 之前(请参阅 this bug report):

为 JdbcTemplate 添加可选支持

有时我发现自己正在处理可能会返回任何一个而没有行的查询。我觉得 JdbcTemplate 目前还没有很好地解决这种情况。当前选项包括:

使用 #queryForObject 并捕获 EmptyResultDataAccessException 使用 #query 或 #queryForList 并检查列表的大小

Java 8 Optionals 非常适合解决这个问题。

我个人会使用queryForList 并检查isEmpty(),因为将逻辑放入catch 中并不干净。

【讨论】:

谢谢 krzyk,这是很好的信息,但在 Spring JDBC 中,DataUtils(如 Roman 所建议的那样也应该可以解决我的问题) 我在这里看到 queryForList 解决方案与 DataUtils 相比具有更好的优势,因为如果错误地返回多行,您不希望您的程序抛出错误并突然结束..

以上是关于Spring JDBC:返回 0 或 1 行的主要内容,如果未能解决你的问题,请参考以下文章

spring整合JDBC

Spring04-SpringEL&Spring JDBC数据访问

JDBC getUpdateCount 在 SQL Server 中返回 0,但更新了 1 行

在 Spring Boot 2、Hibernate、PostgreSQL 中通过 JDBC 语句执行 DDL 时出错

leo--study

Spring Boot JDBC derby 在内存中的配置问题