2015-03-29 3 views
0

Я хочу вызвать хранимую процедуру из PostgreSQL со спящим режимом. Но, если я вызываю эту процедуру через entityManager.getResultList, она возвращает мне список объектов со странными именами атрибутов. Процедура: atributesВызов хранимой процедуры с Hibernate

CREATE OR REPLACE FUNCTION public.show_top10() 
    RETURNS SETOF users 
AS 
$BODY$ 
    SELECT * FROM users 
    ORDER BY message_count DESC 
    LIMIT 10; 
$BODY$ 
LANGUAGE sql VOLATILE; 

пользователя:

private Integer id; 
private String login; 
private String password; 
private Timestamp dateCreated; 
private Long messageCount; 
private Integer role; 
private Collection<Message> messagesById; 

Призвание:

List<Users> result = null; 
      StoredProcedureQuery storedProcedureQuery= entityManager.createStoredProcedureQuery("show_top10"); 
      storedProcedureQuery.execute(); 
      result = storedProcedureQuery.getResultList(); 
      entityManager.getTransaction().commit(); 

И результат:

result

+0

Вместо этого используйте инструкцию 'select':' select * from show_top10() '. Я не знаю Hibernate, но должен быть способ запуска простого выбора аналогичным образом. –

ответ

0

W Вы ожидали?
Ваш SP возвращается ResultSet от SELECT запрос, 10 записей.
SQL сам по себе возвращает только значения, имена не поля ...

Дальше больше - почему вы создаете функцию SQL, которая возвращает ResultSet?

+0

Итак, как я могу вернуть таблицу с рядами пользователей таблицы? –

+0

Если вы надеялись, что Hibernate автоматически отобразит ваши записи в объекты требуемого класса, а не **, я попытался сделать то же самое примерно год назад - вам понадобится создать собственный (ручной) картограф. AFAIR - это недостаток драйвера PostgreSQL при использовании SP. –

+0

@OkadzakiTomoe: вместо этого используйте инструкцию 'select'. У Postgres нет реальных процедур, только функции. И функции следует вызывать с помощью 'select' (т. Е.' Statement.executeQuery() 'не как« процедура »(используя' CallableStatement') –

Смежные вопросы