【问题标题】:Spring JDBC - .queryForObject() returns too many results?Spring JDBC - .queryForObject() 返回太多结果?
【发布时间】:2016-04-23 21:30:37
【问题描述】:

我有这个 SQL 语句:

return jdbcTemplate.queryForObject("SELECT * FROM materials WHERE title = ?", new MaterialMapper(), title);

由于我使用的是.queryForObject,因此我希望只得到一个结果或没有结果。相反,我得到了超过 1 个结果,这会抛出 IncorrectResultSizeDataAccessException

【问题讨论】:

  • 是的,但 .queryForObject 不应该只返回这些对象之一吗?
  • 我明白了,我试试看。
  • 行了,谢谢!
  • 我回滚了您的编辑,答案应该发布在答案部分。我现在做了:)。

标签: java spring jdbc


【解决方案1】:

queryForObject(sql, rowMapper, args) 方法(以及所有重载)明确声明如果查询返回超过 1 行或不返回任何内容,则抛出 IncorrectResultSizeDataAccessException

抛出:IncorrectResultSizeDataAccessException - 如果查询没有准确返回一行

在您的情况下,由于查询 SELECT * FROM materials WHERE title = ? 可以返回多于 1 行,因此您有两种选择:

  • 要么改用query(sql, rowMapper, args) 方法,它返回元素的List 而不仅仅是单行。然后,您可以使用它仅检索第一个元素(如果列表不为空)。
  • 调整您的查询,使其通过限制结果返回单行。

【讨论】:

    【解决方案2】:

    如果查询只返回一行,您也可以使用WHERE ROWNUM = 1 子句。

    这将使您免于例外 - 但您需要谨慎:

    • 结果可能是不确定的,
    • 它可以在您的应用中隐藏问题
    • 让数据损坏不被察觉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-09
      • 2015-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多