Ich habe das Problem dank @gvenzi answer gelöst, aber beschlossen, meine eigene Antwort zu posten, da ich einige zusätzliche Kommentare habe.
Also, ja, OracleLobHandler
löst das Problem. Tatsächlich sind wir jedoch nicht gezwungen, veraltete Klassen zu verwenden. Im OracleLobHandler Dokumentation
Ich habe
Ich habe es getestet und es funktioniert.
Aber ich hatte ein anderes Problem mit SqlLobValue
zusammen mit OracleTypes.BLOB
in PreparedStatementSetter
(Es wird hier beschrieben ClassCastException:SqlLobValue kann mit PreparedStatementSetter nicht in oracle.sql.BLOB umgewandelt werden
)
Mein endgültiger Arbeitscode lautet wie folgt:
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;
}