2

以下のような質問があります。

SELECT COL1, COL2 FROM SCHEM1.TAB1 WHERE COL3=? AND COL4=?

上記のクエリを Java クラスで次のように実行しています。

List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql, (Object[]) queryParams);

問題はqueryParams、次のようにテキスト プロパティ ファイルから実行時に取得していることです。

2013-03-28||helloWorld

上記の行に見られるように、プロパティ ファイルには sql への引数があります。すべての引数は二重パイプで区切られます。

String[]パイプ区切り文字で split メソッドを使用して、この行を に読み込んでいます。

したがって、結果のqueryParams文字列配列は次のようになります。

String[] queryParamsどこにいて、どこにString[0]いるだろう2013-03-28String[1]helloWorld

この投稿の冒頭で述べたように、これをキャストしString[]てテンプレート メソッドに直接渡しているときに、log4j がモードに設定されていると、次のエラーで終了します。queryForListObject[]debug

Exception in thread "main" java.lang.Error: SQLWarning chain holds value that is not a SQLWarning
at java.sql.SQLWarning.getNextWarning(SQLWarning.java:91)
at org.springframework.jdbc.core.JdbcTemplate.handleWarnings(JdbcTemplate.java:1260)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:636)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:665)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:673)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:713)
at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:796)
at com.hsbc.pb.it.re.db.dao.impl.ReconDaoImplNew.getColumnList(MyClass.java:362)

コンソールのこのエラーのすぐ上の行に、次のように記載されています。

SQLWarning ignored: SQL state 'null', error code '0', message [Input data type mismatch, see chained exceptions; will retry execution using describe input information.  Please change application to use an input data type that matches the database column type as required by JDBC semantics.]  

ただし、log4j レベルを に設定すると、このコードは正しく機能しinfoます。

この終了の原因は何ですか?

それを解決する方法?

それはパラメーターの型と関係がありますか (予想される列が Date の場合、String を queryForList に渡しています) ? queryForListもしそうなら、メソッドに渡す前に String を期待される型に正しくフォーマットするにはどうすればよいですか?

プロパティ ファイルを次のように変更できます。

2013-06-28,DATE||helloWorld,VARCHAR

値の型に関する情報も渡されます。しかし、この情報を使用して、文字列を特定の型に変換するにはどうすればよいですか?そのようなアプローチは良い解決策ですか?

log4j がinfoモードのときにエラーが発生しないのはなぜですか?

読んでくれてありがとう!

詳細が不足している場合はお知らせください。

4

1 に答える 1

0

それ2013-06-28,DATE||helloWorld,VARCHARは良い方法です

次のように、いくつかのハンドラーを作成して解析できます。

Map<String,IConvert> converts =  new HashMap<String, IConvert>(){
    put("varchar",new StringConver());
    put("date",new DateConver());
}
//then
converts.get(type).toParam(string)    

log4jがinfoモードのときにエラーが発生しないのはなぜですか、エラーが発生していますdebug mode!String() を日付型に設定しても、jdbcDriver は例外をスローしませんが、「コード: 1292 SQL 状態: HY000 --- 日付値が正しくありません」のような警告を返します。

于 2014-01-24T09:29:58.670 に答える