Передача массивов в функцию PostgreSQL PL / pgSQL - PullRequest
0 голосов
/ 27 октября 2018

Ребята, я много искал в Интернете, как вызывать функцию PostgreSQL, передавая список в качестве параметра. Моя функция показана ниже. Она получила список Long (идентификаторы) и выполнит запрос. Как мне вызвать эту функцию в JPA? передать список Long в качестве параметра? Пожалуйста, помогите, это просто то, что я хочу, просто вызовите функцию, которая получает список параметров, передавая параметры с JPA.

Передача массивов в функцию PostgreSQL

 CREATE OR REPLACE FUNCTION public.fngetempresasfornecembemmaterial(bens_materias bigint[])
  RETURNS SETOF empresa AS
$BODY$
BEGIN
RETURN QUERY
    SELECT * FROM empresa WHERE id IN (
        SELECT empresa_id FROM empresa_bens_materias
        WHERE bem_material_id = ANY(bens_materias)
    );
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Это мой тест, в котором я пытаюсь вызвать функцию, передающую массив в качестве параметра.

@Test
public void testGetEmpresaByCombineEdital() {
        Query q = em.createNativeQuery("SELECT * FROM public.fngetempresasfornecembemmaterial(:ids)");
        List<Integer> l = new ArrayList();
        l.add(1);
        l.add(4);
        q.setParameter("ids", l.toArray());
        q.getResultList().forEach(System.out::println);
}

И я получаю вывод этой консоли тоже:

Hibernate: 
    SELECT
        * 
    FROM
        public.fngetempresasfornecembemmaterial(?)
2018-10-27 10:50:30.803  WARN 25969 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 42883
2018-10-27 10:50:30.803 ERROR 25969 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: function public.fngetempresasfornecembemmaterial(bytea) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.
  Position: 15

1 Ответ

0 голосов
/ 27 октября 2018

В вашей ошибке ОШИБКА: функция public.fngetempresasfornecembemmaterial (bytea) не существует, передается функция bytea not bigint []

SO список, который вы создаете из Integer, выследует попробовать создать его для BigInteger или Long.

List<BigInteger> l = new ArrayList<BigInteger>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...