Спящий режим получить результат от сохраненной функции без использования внешних ключей и исключения сериализации

#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 .

Есть ли какой-нибудь способ, которым я мог бы достичь того, что мне нужно?