Есть ли возможность указать генератор последовательности как значение для столбца в SimpleJdbcInsert
, или любом другом классе для пакетного выполнения?JdbcTemplate
, NamedParameterJdbcTemplate
например, я хочу, чтобы SQL был сгенерирован любым из вышеперечисленных классов как:
INSERT INTO SOME_TABLE_NAME (ID, COLUMN_A,...) VALUES (SOME_SEQUENCE.NEXTVAL, 'value for column A', ...);
Пример фрагмента кода выглядит так:
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
List<SomeTableEntity> listOfEntities; // received from method parameter
SimpleJdbcInsert sql = new SimpleJdbcInsert(dataSource).withTableName("SOME_TABLE_NAME");
SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(listOfEntities.toArray());
sql.executeBatch(batch);
Я пытался обмануть SimpleJdbcInsert
как:
SqlParameterSource id = new MapSqlParameterSource("ID", "SOME_SEQUENCE.nextval"));
SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(listOfEntities.toArray());
List<SqlParameterSource> params = new ArrayList<>(batch.length + 1);
params.add(id);
for (SqlParameterSource param : batch)
{
params.add(param);
}
sql.executeBatch(params.toArray(new SqlParameterSource[] {}));
Но неудивительно, что это не сработало, поскольку столбец ID
имеет числовой тип, и он пытался заполнить значение как "SOME_SEQUENCE.nextval"
вместо оценки результата SOME_SEQUENCE.nextval
.
PS: в таблице слишком много столбцов, и из-за этого я не хочу использовать подготовленный оператор solution
String sql = "INSERT INTO USER
(USER_PK, ACCOUNTNUMBER, FIRSTNAME, LASTNAME, EMAIL )
VALUES
(user.nextval, ?, ?, ?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, accountNumber);
ps.setString(2, firstName);
ps.setString(3, lastName);
ps.setString(4, email);
ID
. - person Mohammad Faisal   schedule 05.02.2020insert
, чтобы получить следующий идентификатор в соответствующей последовательности, а затем добавить это значение в запрос. - person mohammedkhan   schedule 18.02.2020INSERT
отдельно. - person mohammedkhan   schedule 20.02.2020