【问题标题】:NamedParameterJdbcTemplate.query for returning only one elementNamedParameterJdbcTemplate.query 只返回一个元素
【发布时间】:2022-01-19 11:02:06
【问题描述】:

我正在编写一种方法来检索 DB 的元素,该元素提供 Long id 参数。

这个 id 是唯一的,所以该方法应该只返回一个元素,我想创建一个类实例并检索这个元素。

我做了以下方法,效果很好:

@Override
public ElementEntity getElement(final long id)
{
    final MapSqlParameterSource paramSource = new MapSqlParameterSource();
    paramSource.addValue("element_id", id);
    final List<ElementEntity > listOfElements =
        namedParameterJdbcOperations.query(SQL_RETURN_ELEMENT_BY_ID, paramSource, ROW_MAPPER_ELEMENT);
    return !listOfElements .isEmpty() ? listOfElements.get(0) : null;
}

ROW_MAPPER 是这样实现的:

private static final RowMapper<ElementEntity > ROW_MAPPER_INSTALLER =
    (rs, RowNum) ->
        new ElementEntityBuilder().setElement(rs.getBytes("ELEMENT")).build();

元素是一个字节数组。我再说一遍,效果很好。但我想避免使用列表并检索第一个位置,而是直接创建 ElementEntity。所以我尝试了以下方法:

 @Override
public ElementEntity getElement(final long id)
{
    final MapSqlParameterSource paramSource = new MapSqlParameterSource();
    paramSource.addValue("element_id", id);

    return namedParameterJdbcOperations.query(SQL_RETURN_ELEMENT_BY_ID, paramSource, (ResultSet rs) -> new DesktopAppInstallerEntity(rs.getBytes("ELEMENT")));
}

虽然我没有进行任何更改,但它给了我以下错误:org.h2.jdbc.JdbcSQLNonTransientException: No data is available

这是完整的错误(我更改了一些词以避免显示真正的 SQL 查询):

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT SOMETHING FROM SOMEWHERE WHERE id = ?]; No data is available [2000-200]; nested exception is org.h2.jdbc.JdbcSQLNonTransientException: No data is available [2000-200]

我对所有这些 JDBC 都很陌生,但在我看来,当我应用此更改时 paramSource 无法正常工作,而且我不知道为什么会发生这种情况,因为我只是在更改结果提取器。

【问题讨论】:

    标签: java oracle jdbc


    【解决方案1】:

    嗯,我自己想通了。我将分享我的答案以帮助社区。我使用NamedParameterJdbcOperations.queryForObject 而不是namedParameterJdbcOperations.query 并使用相同的ROW_MAPPER:

    @Override
    public ElementEntity getElement(final long id)
    {
        final MapSqlParameterSource paramSource = new MapSqlParameterSource();
        paramSource.addValue("id", id);
    
        try
        {
            return namedParameterJdbcOperations.queryForObject(SQL_RETURN_ELEMENT, paramSource, ROW_MAPPER_ELEMENT);
        }
        catch (EmptyResultDataAccessException e)
        {
            return null;
        }
    }
    

    在我的特殊情况下,我有兴趣了解 SQL 查询何时尝试查找数据库中不存在的元素。为此,我捕获并处理抛出的EmptyResultDataAccessException

    更多信息可以在这里找到:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/namedparam/NamedParameterJdbcTemplate.html#queryForObject-java.lang.String-org.springframework.jdbc.core.namedparam.SqlParameterSource-org.springframework.jdbc.core.RowMapper-

    【讨论】:

      猜你喜欢
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 2016-10-21
      • 2015-12-03
      相关资源
      最近更新 更多