Согласно документации JDBI , достижение чего-то подобного с использованием Oracle может быть довольно сложным, поэтому лучше было бы использовать описанный первый подход (UseStringTemplate3StatementLocator):
Oracle поддерживает нечто подобное, но вам нужно использовать специальные API-интерфейсы Oracle и экземпляры oracle.sql.ARRAY. В случае Oracle вы должны предварительно объявить тип массива в базе данных в первую очередь, и поскольку он хранит массив в базе данных, освободите его после вызова.
Сказав это, существует простой подход, который можно использовать для выполнения этой работы в Oracle, которая должна присоединиться к элементам в списке с запятой. Я изменил ListArgumentFactory с помощью метода Java 8 String.join:
public class ListArgumentFactory implements ArgumentFactory<List> {
@Override
public boolean accepts(Class<?> expectedType, Object value, StatementContext ctx) {
return value instanceof List;
}
@Override
public Argument build(Class<?> expectedType, final List value, StatementContext ctx) {
return new Argument() {
@Override
public void apply(int position, PreparedStatement statement, StatementContext ctx) throws SQLException {
statement.setString(position, String.join(",", value));
}
};
}
}
Я пробовал подход, описанный в документации JDBI, для использования oracle.sql.ARRAY и пользовательского TYPE в Oracle DB, но для меня это не удавалось.