Вызов (Postgres) функция в репозитории JPA

1

Я пытаюсь вызвать функцию, которую я определил в своей базе данных Postgres.

CREATE OR REPLACE FUNCTION bacon()
  RETURNS text AS
$BODY$
SELECT cast('ingeborg' as text)
$BODY$
  LANGUAGE sql STABLE;
ALTER FUNCTION bacon()
  OWNER TO my_user;

В моем репозитории Spring я пытаюсь вызвать функцию

@Repository
public class ItemRepository {

  @PersistenceContext(name = "com.project.persistenceUnit")
  private EntityManager entityManager;

 public Collection<ItemView> findBy() {
    String statement = "SELECT * FROM schema.bacon()";

     String result = (String) entityManager.createNativeQuery(statement)
        .getSingleResult();
  }

}

Когда я пытаюсь извлечь данные из репозитория, я получаю следующую ошибку

11.04.2014 11:34:00.177 [main] WARN  o.h.e.jdbc.spi.SqlExceptionHelper:144 @ SQL Error: 0, SQLState: 42883
11.04.2014 11:34:00.177 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper:146 @ ERROR: Function schema.bacon() does not exist

SQLState 42883 является "undefined_function" (http://www.postgresql.org/docs/9.3/static/errcodes-appendix.html)

Функция работает при вызове в pgAdmin.

Что я делаю не так? Как я могу назвать определенную функцию?

Обновить

Я был связан с неправильной базой данных и должен был следить за следующим сообщением:

public class MyExtendedPostgresSQLDialect extends PostgreSQL9Dialect {

    public MyExtendedPostgresSQLDialect() {
        super();
        registerFunction("bacon", new PostgresBacon());
    }

}
public class PostgresBacon implements SQLFunction {

    @Override
    public boolean hasArguments() {
        return false;
    }

    @Override
    public boolean hasParenthesesIfNoArguments() {
        return false;
    }

    @Override
    public Type getReturnType(Type firstArgumentType, Mapping mapping) throws QueryException {
        return TextType.INSTANCE;
    }

    @Override
    public String render(Type firstArgumentType, List arguments, SessionFactoryImplementor factory) throws QueryException {
        return "bacon()";
    }

}
  • 0
    Вы зафиксировали оператор create function ? Или, может быть, вы подключаете не ту базу данных?
  • 0
    @a_horse_with_no_name, да, я был подключен к неправильной базе данных. Я также должен был зарегистрировать функцию после этого поста
Теги:
jpa

1 ответ

0

Я думаю, что ваш путь search_path не установлен равным при создании функции и функции вызова. для exp:

digoal=# show search_path;
  search_path   
----------------
 "$user",public
(1 row)
digoal=# \c digoal digoal
You are now connected to database "digoal" as user "digoal".
digoal=> create function f_test1() returns void as $$
digoal$> declare
digoal$> begin
digoal$> end;
digoal$> $$ language plpgsql;
CREATE FUNCTION
digoal=> select f_test1();
 f_test1 
---------

(1 row)

digoal=> \c digoal postgres
You are now connected to database "digoal" as user "postgres".
digoal=# select f_test1();
ERROR:  function f_test1() does not exist
LINE 1: select f_test1();
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
digoal=# \dn
  List of schemas
  Name  |  Owner   
--------+----------
 digoal | postgres
 public | postgres
(2 rows)

digoal=# \df digoal.f_test1
                         List of functions
 Schema |  Name   | Result data type | Argument data types |  Type  
--------+---------+------------------+---------------------+--------
 digoal | f_test1 | void             |                     | normal
(1 row)

digoal=# \df public.f_test1
                       List of functions
 Schema | Name | Result data type | Argument data types | Type 
--------+------+------------------+---------------------+------
(0 rows)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню