Мне нужно обновить таблицу только при определенных условиях. Итак, для ложного сценария ios, в котором я не хочу обновлять БД, я не устанавливаю никаких значений в индексе моего запроса, который бросает Exception
BadSqlGrammarException
и после получения я не могу вставить оставшиеся значения.
Итак, я хочу обработать Exception
внутри setValue()
из jdbcTemplate.batchUpdate
, чтобы даже в случае появления Exception
я мог обновить оставшиеся столбцы.
Вот мой код:
public HashMap<String, Object> updatePanelistIdsState(RejectPanelistBean rejectPanelistBean) {
String sql="", rowData[];
CommonsMultipartFile file=null;
int affectedRecords=0,x[]=null;
final HashMap<String, Object> map = new HashMap<String,Object>();
try{
sql = "UPDATE lu_registration " +
"SET admin_approval_status = ? , reject_reason = ?, reject_date = ? where panelist_id = ?";
file=rejectPanelistBean.getRejectPanelistIdFile();
rowData = file.getFileItem().getString().trim().split("\n");
System.out.println("size"+rowData.length);
final String[] finalData = Arrays.copyOfRange(rowData, 1, rowData.length);
x = jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
int p2r = 0, p2s = 0, p2a = 0;
int s2r = 0, s2p = 0, s2a = 0;
int a2r = 0, a2s = 0, a2p = 0;
int a2a = 0, s2s = 0, p2p = 0;
int r2any = 0;
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
String temp="", cells[] = finalData[i].split("\\s*,\\s*");
String sqlInsert = "insert into panelist_approval_track (panelist_id, prev_admin_approval_status, " +
"admin_approval_status,reason,reviewed_by,reviewed_on) " +
"values " +
"(?,?,?,?,?,now())";
String sqlInsertApprove = "insert into panelist_approval_track (panelist_id, prev_admin_approval_status, " +
"admin_approval_status,reviewed_by,reviewed_on) " +
"values " +
"(?,?,?,?,now())";
LoginBean login = (LoginBean)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String loggedUserId = login.getEmployeeId();
String currentStatus = cells[1];
String prevStatus = jdbcTemplate.queryForObject("SELECT admin_approval_status FROM lu_registration WHERE panelist_id = " + cells[0], String.class);
switch (prevStatus) {
case "P": // -- Case 1
switch (currentStatus) {
case "R":
ps.setString(1, cells[1]);
ps.setString(2, cells[2]);
ps.setTimestamp(3, java.sql.Timestamp.valueOf(java.time.LocalDateTime.now()));
ps.setString(4, cells[0]);
jdbcTemplate.update(sqlInsert, cells[0], prevStatus, currentStatus, cells[2], loggedUserId);
p2r++;
break;
case "S":
p2s++;
break;
case "A":
p2a++;
break;
default:
ps.setString(1, cells[1]);
ps.setString(2, cells[2]);
ps.setNull(3, java.sql.Types.DATE);
ps.setString(4, cells[0]);
jdbcTemplate.update(sqlInsert, cells[0], prevStatus, currentStatus, cells[2], loggedUserId);
p2p++;
break;
}
break;
default: // -- r2any
r2any++;
break;
}
map.put("p2r", p2r);
map.put("p2s", p2s);
map.put("p2a", p2a);
map.put("r2any", r2any);
}
@Override
public int getBatchSize() {
System.out.println("final Len: "+finalData.length);
return finalData.length;
}
});
for(int i:x)
affectedRecords+=i;
map.put("affectedRecords", affectedRecords);
map.put("affectedBool", affectedRecords>0);
return map;
}catch(Exception e)
{
System.out.println("Exception In updatePanelistIdsState: "+e);
e.printStackTrace();
}
map.put("affectedBool", false);
return map;
}
Вы могли видеть, что в некоторых случаях я не устанавливаю никаких значений в ps
(и которые мне не нужны), но из-за этого оставшиеся столбцы не умеют обновлять. Как работать без сбоев, даже если возникает Exception
?