【发布时间】: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 无法正常工作,而且我不知道为什么会发生这种情况,因为我只是在更改结果提取器。
【问题讨论】: