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

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

【问题讨论】:

    标签: java spring jdbc spring-jdbc jdbctemplate


    【解决方案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 相比具有更好的优势,因为如果错误地返回多行,您不希望您的程序抛出错误并突然结束..
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2014-03-12
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多