107

JdbcTemplateのqueryforInt/queryforLongメソッドは、Spring3.2で非推奨になりました。これらのメソッドを使用して既存のコードを置き換えるためのベストプラクティスと考えられる理由や内容がわかりません。

典型的な方法:

int rowCount = jscoreJdbcTemplate.queryForInt(
    "SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
    playerNameKey.toUpperCase(),
    teamNameKey.toUpperCase()
);

OK、上記のメソッドは次のように書き直す必要があります。

Object[] params = new Object[] { 
   playerNameKey.toUpperCase(), 
   teamNameKey.toUpperCase()
};
int rowCount = jscoreJdbcTemplate.queryForObject(
    "SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
    params, Integer.class);

明らかに、この非推奨により、JdbcTemplateクラスが単純になります(またはそうなりますか?)。QueryForIntは常に便利なメソッドであり(私は推測します)、長い間使用されてきました。なぜ削除されたのですか。その結果、コードはより複雑になります。

4

6 に答える 6

112

私が思うに、queryForInt / Longメソッドには紛らわしいセマンティクスがあることに気付いた人がいます。つまり、JdbcTemplateソースコードから、現在の実装を確認できます。

@Deprecated
public int queryForInt(String sql, Object... args) throws DataAccessException {
    Number number = queryForObject(sql, args, Integer.class);
    return (number != null ? number.intValue() : 0);
}

これにより、結果セットが空の場合は0が返されると思われるかもしれませんが、例外がスローされます。

org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0

したがって、次の実装は基本的に現在の実装と同等です。

@Deprecated
public int queryForInt(String sql, Object... args) throws DataAccessException {
    return queryForObject(sql, args, Integer.class);
}

そして、非推奨ではないコードを醜いものに置き換える必要があります。

    queryForObject(sql, new Object { arg1, arg2, ...}, Integer.class);

またはこれ(より良い):

    queryForObject(sql, Integer.class, arg1, arg2, ...);
于 2013-04-05T16:40:01.743 に答える
38

便利なメソッドqueryForLong(sql)を廃止することは不便であるという元の投稿者に同意します。

Spring 3.1を使用してアプリを開発し、最新のSpringバージョン(3.2.3)に更新したところ、廃止されていることに気付きました。

幸いなことに、それは私にとって1行の変更でした。

return jdbcTemplate.queryForLong(sql);  // deprecated in Spring 3.2.x

に変更されました

return jdbcTemplate.queryForObject(sql, Long.class);

そして、いくつかのユニットテストは、上記の変更が機能することを示しているようです。

于 2013-07-25T15:09:51.273 に答える
15

を支持して非推奨queryForObject(String, Class)

于 2013-03-27T14:33:59.223 に答える
13

そのようなコードを置き換える:

long num = jdbcTemplate.queryForLong(sql);

このコードで:

long num = jdbcTemplate.queryForObject(sql, Long.class);

列の値がnullの場合、queryForObjectはnullを返し、プリミティブ型をnullにすることはできず、NullPointerExceptionが発生するため非常に危険です。コンパイラはこれについて警告しませんでした。実行時にこのエラーについて知ることができます。プリミティブ型を返すメソッドがある場合と同じエラーが発生します。

public long getValue(String sql) {
    return = jdbcTemplate.queryForObject(sql, Long.class);
}

Spring 3.2.2のJdbcTemplateで非推奨になったメソッドqueryForLongの本文は、次のとおりです。

@Deprecated
public long queryForLong(String sql) throws DataAccessException {
    Number number = queryForObject(sql, Long.class);
    return (number != null ? number.longValue() : 0);
}

プリミティブ値を返す前に、これがnullでないことを確認し、nullの場合は0を返します。ちなみに、-0Lである必要があります。

于 2013-08-06T09:22:43.013 に答える
2

JdbcTemplate#queryForInt列の値がSQLNULLまたは0の場合、0を返します。一方のケースをもう一方のケースと区別する方法はありません。これが、このメソッドが非推奨になった主な理由だと思います。ところで、ResultSet#getInt同じように動作します。ただし、これら2つのケースは。で区別できますResultSet#wasNull

于 2016-03-17T16:23:38.083 に答える
-1
public int getCircleCount() {
    Object param = "1";
    String sql = "select count(*) from circle where id = ? ";
    jdbcTemplate.setDataSource(getDataSource());
    int result = getJdbcTemplate().queryForObject(sql, new Object[] { param }, Integer.class);
    return result;
}
于 2018-03-05T06:36:07.167 に答える