首页 > 解决方案 > Hibernate 从存储的函数中获取结果而不使用外键和 SerializationException

问题描述

我正在尝试从返回表的所有列和其他一些列的存储函数中获取结果。

使用以下本机查询进行存储的函数调用:

// 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;
}

我收到的错误与 Order 实体相关联:

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$
;

我能想到的一种解决方案是返回订单 ID 而不是它的所有列,并且在我的Result类中使用关系映射,但是这样做会出现很大的性能问题,因为 Hibernate 将为select我的所有Orders.

有什么办法可以实现我需要的吗?

标签: javapostgresqlspring-boothibernatestored-functions

解决方案


推荐阅读