#java #postgresql #spring-boot #hibernate #stored-functions
Вопрос:
Я пытаюсь получить результат от сохраненной функции, которая возвращает все столбцы таблицы и некоторые другие дополнительные.
Вызов сохраненной функции выполняется с помощью следующего собственного запроса:
// My query
select * from test_func(... some_params...)
as (id numeric, "order" "order", rows_count int8);
// EntityManager usage
final Query query = entityManager.createNativeQuery(query_above, Result.class)...
Моя результирующая сущность выглядит примерно так:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Result {
@Id
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Long id;
// Trouble entity
private Order order;
private Long rowsCount;
}
Ошибка, которую я получаю, связана с объектом Заказа:
org.hibernate.type.SerializationException: could not deserialize
Caused by: java.io.StreamCorruptedException: invalid stream header: 28323537
Моя сохраненная функция выглядит примерно так:
CREATE OR REPLACE FUNCTION public.test_func(...)
RETURNS SETOF record
LANGUAGE plpgsql
AS $function$
DECLARE
_sql VARCHAR;
begin
_sql := 'SELECT o "order", count(*) over() as rows_count
from public.order o
... inner joins and other stuff';
return query
execute _sql using ..._sql params...;
END;
$function$
;
Одно из решений, которое я мог бы придумать, — это возвращать идентификаторы заказов вместо всех его столбцов, и в моем Result
классе использовать реляционное сопоставление, однако при этом возникают большие проблемы с производительностью, так как Hibernate будет выполнять select
запросы для всех моих Orders
.
Есть ли какой-нибудь способ, которым я мог бы достичь того, что мне нужно?