JdbcTemplateを使用してMySQLのVARBINARYフィールドを文字列として読み取るのに問題があります。文字列の略語(「ABC」、「XYZ」、「LMN」など)をVARBINARYとして保存しています(理由は聞かないでください)。不思議なことに、Connectionクラス/ PreparedStatementルートを使用し、単純な古いResultSetsとSqlRowSetを使用すると、文字列の読み取りに問題はありません。つまり、
このコードは機能します:
String sql = "select MY_VARBINARY_FIELD from MY_TABLE where KEY1=? and KEY2=?";
PreparedStatement stmt = connectionDev.prepareStatement(sql);
prepStmt1.setInt(1, key1);
prepStmt1.setInt(2, key2);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
String s = rs.getString("MY_VARBINARY_FIELD");
System.out.print(s + " ");
}
**Output:** AHI-1 DKFZp686J1653 FLJ14023 FLJ20069 JBTS3 ORF1 dJ71N10.1
しかし、このコードはそうではありません:
String sql = "select MY_VARBINARY_FIELD from MY_TABLE where KEY1=? and KEY2=?";
Object[] params = {key1, key2};
SqlRowSet rows = getJdbcTemplate().queryForRowSet(sql, params);
while (rows.next()) {
String s = rows.getString("MY_VARBINARY_FIELD");
System.out.print(s + " ");
}
**Output:** [B@3a329572 [B@4ef18d37 [B@546e3e5e [B@11c0b8a0 [B@399197b [B@3857dc15 [B@10320399
SqlRowSetとResultSetがVARBINARYに対して異なる文字列表現を生成するのはなぜですか?また、JdbcTemplate / SqlRowSetを使用して「正しい」表現を取得するにはどうすればよいですか?
ありがとう!
解決
Mark Rotteveel(下)が質問に答えました。私はこれで動作するようになりました:
String sql = "select MY_VARBINARY from MY_TABLE where KEY=VALUE";
SqlRowSet rows = getJdbcTemplate().queryForRowSet(sql);
while (rows.next()) {
byte[] varbinary = (byte[]) rows.getObject("MY_VARBINARY");
System.out.println(new String(varbinary));
}