Spring Boot - параметр массива функций PostgreSQL - PullRequest
0 голосов
/ 16 ноября 2018

Когда я использую функцию postgresql с пружинной загрузкой, она возвращает ошибку несоответствия данных при использовании параметра массива.

У меня есть файл модели.Я последовательно сохраняю данные в этот файл модели.Когда я отправляю это функции следующим образом, я получаю сообщение об ошибке.

        StoredProcedureQuery subscriber = entityManager.createStoredProcedureQuery("fn_subscriber_to_iservice");
    subscriber.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN);
    subscriber.registerStoredProcedureParameter(2, Integer.class, ParameterMode.IN);
    subscriber.registerStoredProcedureParameter(3, String.class, ParameterMode.IN);
    subscriber.registerStoredProcedureParameter(4, String.class, ParameterMode.IN);
    subscriber.registerStoredProcedureParameter(5, Double.class, ParameterMode.IN);
    subscriber.registerStoredProcedureParameter(6, Double.class, ParameterMode.IN);
    subscriber.registerStoredProcedureParameter(7, Double.class, ParameterMode.IN);
    subscriber.registerStoredProcedureParameter(8, Integer.class, ParameterMode.IN);
    subscriber.registerStoredProcedureParameter(9, Integer.class, ParameterMode.IN);
    **subscriber.registerStoredProcedureParameter(10, Object[].class, ParameterMode.IN)**;


subscriber.setParameter(1, Integer.valueOf(String.valueOf(payload.getService_id())));
    subscriber.setParameter(2, Integer.valueOf(String.valueOf(userDetail.getId())));
    subscriber.setParameter(3, String.valueOf(payload.getStart_date()));
    subscriber.setParameter(4, String.valueOf(payload.getEnd_date()));
    subscriber.setParameter(5, payload.getTotal_price());
    subscriber.setParameter(6, 0.00);
    subscriber.setParameter(7, payload.getPrice_per_person());
    subscriber.setParameter(8, Integer.valueOf(String.valueOf(payload.getStart_station_id())));
    subscriber.setParameter(9, Integer.valueOf(String.valueOf(payload.getEnd_station_id())));
    **subscriber.setParameter(10, payload.getPassengers().toArray());**

Параметры функции PostgreSQL

CREATE OR REPLACE FUNCTION "public"."fn_subscriber_to_iservice"("_service_id" int4, "user_id" int4, "_start_date" varchar, "_end_date" varchar, "total_price" float8, "total_month" float8, "price_per_person" float8, "_start_station_id" int4, "_end_station_id" int4, "passengerlist" json)

ОШИБКА

ОШИБКА 15464 --- [nio-8080-exec-1] oaccC [. [. [/]. [DispatcherServlet]: Servlet.service () для сервлета [dispatcherServlet] в контексте спуть [] выдал исключение [Ошибка обработки запроса;вложенным исключением является javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: ошибка вызова CallableStatement.getMoreResults] с первопричиной org.postgresql.util.PSQLException: ошибка: функцияточность, двойная точность, двойная точность, целое число, целое число, байт) не существует İpucu: ни одна функция не соответствует заданному имени и типу аргумента.Возможно, вам придется добавить явные приведения типов.Позиция: 15

Спасибо.

1 Ответ

0 голосов
/ 16 ноября 2018

Проблема в том, что вы передаете массив параметру json здесь:

subscriber.setParameter(10, payload.getPassengers().toArray());

Сначала вам нужно преобразовать его в строку JSON.Предполагая, что функция на самом деле хочет идентификаторы пассажиров, вы можете сделать следующее:

StringBuilder ab = new StringBuilder();
ab.append('{');
for (Passenger p : payload.getPassengers()) {
    ab.append(p.getId()).append(',');
}
ab.replace(ab.length()-1, ab.length(), "}");
subscriber.setParameter(10, ab.toString());

И изменить конечный параметр определения функции с "passengerlist" json на "passengerlist" bigint[] или int[], в зависимости от типа идентификатора.,Это также избавит вас от болезненного преобразования массива json в целочисленные идентификаторы, которые вы могли бы использовать.

Обратите внимание, что этот алгоритм описывает строковую версию массивов PostgreSQL и не совместим с другими базами данных.Он также не описывает массивы, содержащие строки или их escape-последовательности.Эта простая версия работает только с числовыми значениями.

В конечном итоге это также может не сработать, если функция автоматического преобразования типов не зарегистрирована от строки к данному типу.

...