указать генератор последовательности в качестве значения - PullRequest
0 голосов
/ 05 февраля 2020

Есть ли возможность указать генератор последовательности в качестве значения для столбца в 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 as:

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 имеет тип цифра c и он попытался заполнить значение как "SOME_SEQUENCE.nextval" вместо оценки результата SOME_SEQUENCE.nextval.


PS: в таблице слишком много столбцов, и поэтому я не хочу использовать подготовленный оператор решение

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);
...