У меня есть длинный список аргументов, которые мне нужно отправить в базу данных оракула. Мне удалось это сделать, разделив запрос, но я не могу найти способ сделать то же самое с помощью jdbcTemplate. мой запрос:

select name,age from person where personId in (A1,F2,D3...G900) 
or personId in (A901, C902 , ... R1800) 
or personId in (A1801,G1802 .... H2700)
or personId in (P2701, G2702 ... R3600)

Или поскольку оракул разрешает более 1000 элементов, но не позволяет использовать эквивалент JDBC для

SELECT field1, field2, field3
FROM table1
WHERE (1, name) IN ((1, value1), (1, value2), (1, value3),.....(1, value5000));
0
Ashish 20 Ноя 2019 в 14:59
Можете ли вы использовать WHERE id> 1 AND id <10000
 – 
nicholasnet
20 Ноя 2019 в 15:02
Нет, я не могу этого сделать.
 – 
Ashish
20 Ноя 2019 в 16:32

2 ответа

List<Map<String, Object>> findPeeps(List<Long> personIds) {
    String sql = "select name,age from person where personId in (:personIds)";
    return namedParameterJdbcTemplate.queryForList(sql, new MapSqlParameterSource("personIds", personIds));
}
0
Zaki 20 Ноя 2019 в 15:21
Может ли это занять более 1000 записей?
 – 
Ashish
20 Ноя 2019 в 16:33
Проблема с этим решением вызвана: java.sql.SQLSyntaxErrorException: ORA-01795: максимальное количество выражений в списке - 1000
 – 
Ashish
20 Ноя 2019 в 17:19
Сколько элементов вы ожидаете во входных данных?
 – 
Zaki
21 Ноя 2019 в 12:34
Придумайте способ разбить вашу коллекцию, содержащую все входные идентификаторы personId, на несколько коллекций по тысяче элементов в каждой (поскольку Oracle допускает максимум 1000 в предложении IN). Создайте строку SQL с заполнителями для каждой из этих коллекций, а затем передайте ее в jdbcTemplate с фактическими значениями заполнителей (коллекции, полученные после разделения), как показано в моем ответе выше.
 – 
Zaki
21 Ноя 2019 в 12:43
Я ожидаю, что будет передано 60K записей, проблема в том, что учетная запись, которую я использую, не может создать временную таблицу, поэтому создание временной таблицы неуместно.
 – 
Ashish
21 Ноя 2019 в 17:12

Как сказал @zaki, вы можете использовать это, но вы получаете ошибку от Oracle, поскольку существует ограничение на количество записей, которые вы можете поместить в предложение WHERE IN. Вы можете попробовать что-то вроде этого

insert into TEMP values ( ... );
 select * from T where (a,b) in (select x,y from temp);
 delete from TEMP;
0
nicholasnet 20 Ноя 2019 в 17:35
Я не могу создать таблицу базы данных, так как у моей учетной записи нет доступа для ее создания
 – 
Ashish
20 Ноя 2019 в 17:40
1
Затем вам придется вручную создать строку запроса на основе имеющихся идентификаторов и использовать OR или UNION. SELECT * FROM t WHERE id IN (1,2,3) UNION ALL SELECT * FROM WHERE id IN (4,5,6). Что-то подобное
 – 
nicholasnet
20 Ноя 2019 в 17:47
Спасибо, что поможет. ценить это
 – 
Ashish
20 Ноя 2019 в 18:12
Однако проблема снова в том, как преобразовать его в jdbctemplate?
 – 
Ashish
20 Ноя 2019 в 18:25