Saya memecahkan masalah berkat jawaban @gvenzi, tetapi memutuskan untuk memposting jawaban saya sendiri karena saya memiliki beberapa komentar tambahan.
Jadi, ya, OracleLobHandler
memecahkan masalah. Namun nyatanya kita tidak dipaksa untuk menggunakan kelas yang sudah usang. Dalam OracleLobHandler dokumentasi
Saya menemukan
Saya mengujinya dan berhasil.
Tapi saya punya masalah lain menggunakan SqlLobValue
bersama dengan OracleTypes.BLOB
di PreparedStatementSetter
(dijelaskan di sini ClassCastException:SqlLobValue tidak dapat dilemparkan ke Oracle.sql.BLOB menggunakan PreparedStatementSetter
)
Kode kerja terakhir saya adalah sebagai berikut:
public void saveThumbnails(List<Thumbnail> fileList) throws SQLException, IOException {
BatchPreparedStatementSetter b = new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Thumbnail thumbnail = fileList.get(i);
byte[] thumbnailBytes = thumbnail.getThumbnail();
ps.setObject(1, thumbnail.getFileCId(), OracleTypes.NUMBER);
ps.setObject(2, thumbnail.getType().toString(), OracleTypes.VARCHAR);
DefaultLobHandler lobHandler = new DefaultLobHandler();
lobHandler.setCreateTemporaryLob(true);
lobHandler.getLobCreator().setBlobAsBytes(ps, 3, thumbnailBytes);
}
@Override
public int getBatchSize() {
return fileList.size();
}
};
jdbcTemplate.batchUpdate(getSaveThumbnailSql(), b);
}
private String getSaveThumbnailSql() {
// @formatter:off
String sql = ""
+ "MERGE INTO file_thumbnails "
+ " USING (SELECT ? as file_c_id, ? as thumbnail_type, ? AS thumbnail_image FROM DUAL) tmp "
+ " ON (file_thumbnails.file_c_id = tmp.file_c_id AND "
+ " file_thumbnails.thumbnail_type = tmp.thumbnail_type) "
+ " WHEN MATCHED THEN "
+ " UPDATE "
+ " SET thumbnail_image = tmp.thumbnail_image"
+ " ,thumbnail_date = SYSDATE "
+ " WHEN NOT MATCHED THEN "
+ " INSERT (c_id, file_c_id, thumbnail_type, thumbnail_image, thumbnail_date) "
+ " VALUES (cedar_c_id_seq.nextval, tmp.file_c_id, tmp.thumbnail_type, tmp.thumbnail_image , SYSDATE)";
//@formatter:on
return sql;
}