おそらくJdbcTemplate
を直接使用するか、SimpleJdbcCall
(DataSource
の代わりに)で使用するためにサブクラス化する必要があります。 JdbcTemplate
にはメソッドexecute(CallableStatementCreator, CallableStatementCallback)
があり、コールバックを渡して、使用されているStatementオブジェクトを取得できます。
このメソッドをオーバーライドし、渡されたコールバックを後で使用できるようにストアする独自のものでラップすることができます。
public class CustomJdbcTemplate extends JdbcTemplate {
private CallableStatement lastStatement;
public CustomJdbcTemplate(DataSource dataSource) {
super(dataSource);
}
public CallableStatement getLastStatement() {
return lastStatement;
}
@Override
public <T> T execute(CallableStatementCreator csc, CallableStatementCallback<T> action) throws DataAccessException {
StoringCallableStatementCallback<T> callback = new StoringCallableStatementCallback<T>(action);
try {
return super.execute(csc, callback);
}
finally {
this.lastStatement = callback.statement;
}
}
private static class StoringCallableStatementCallback<T> implements CallableStatementCallback<T> {
private CallableStatementCallback<T> delegate;
private CallableStatement statement;
private StoringCallableStatementCallback(CallableStatementCallback<T> delegate) {
this.delegate = delegate;
}
@Override
public T doInCallableStatement(CallableStatement cs) throws SQLException, DataAccessException {
this.statement = cs;
return delegate.doInCallableStatement(cs);
}
}
}
あなたが後でそれを取得するとき文がおそらくそうgetWarnings()
が使用するJDBCドライバに応じて、エラーが発生する可能性があり、閉鎖されることに注意してください。したがって、ステートメント自体の代わりに警告を保存する必要があります。
ちょっと感謝。私はコールバックに少し新しくなったので、私の質問は、私が実際に私のプログラムでこれをどのように呼び出すのでしょうか? (NamedJDBCTemplateを使用している場合はこれが変わりますか?)namedCustomJdbcTemplate.execute(sql、params、<....>) – Steve
Upvoted Up(努力しているかもしれませんが)、私はすぐに投稿する別の解決策を考え出しました。 – Steve
@Steveソリューションは**多く**良いです。 –