मैंने @gvenzi उत्तर के लिए धन्यवाद समस्या हल की, लेकिन अपना उत्तर पोस्ट करने का निर्णय लिया क्योंकि मेरे पास कुछ अतिरिक्त टिप्पणियां हैं।
तो, हाँ, OracleLobHandler
समस्या का समाधान करता है। लेकिन वास्तव में हमें बहिष्कृत वर्ग का उपयोग करने के लिए मजबूर नहीं किया जाता है। OracleLobHandler में दस्तावेज़ीकरण
मैंने पाया
मैंने इसका परीक्षण किया और यह काम करता है।
लेकिन मुझे SqlLobValue
का उपयोग करने में एक और समस्या थी साथ में OracleTypes.BLOB
PreparedStatementSetter
. में (यह यहाँ वर्णित है ClassCastException:SqlLobValue को oracle.sql.BLOB पर रेडीस्टेडमेंटसेटर का उपयोग करके नहीं डाला जा सकता है
)
मेरा अंतिम कार्य कोड इस प्रकार है:
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;
}