java - 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
.
有什么办法可以实现我需要的吗?
解决方案
推荐阅读
- flutter - 文本跨度中的 Flutter TapGestureRecognizer 无法检测到具有不同样式的小词——如果它是一个或两个字符
- javascript - 如何选择一个按钮,其 id 等于 jQuery 中的某个变量
- python - Django Rest Framework 电子邮件验证无效
- swiftui - 为什么在 SwiftUI 中两次调用外部结构
- android - Android Studio 调试构建到设备使设备断开连接
- javascript - 使用递增的 ID 值动态重新创建/克隆表单
- java - 如何在没有嵌套订阅的情况下组合/链接多个包含不同数据类型的 Mono/Flux
- r - 如何在具有日期的列上对数据框进行子集化
- python - 将 PHP FOR 循环转换为 Python FOR LOOP 到 XOR 2 字符串
- rest - REST 创建请求是否应该拒绝带有自动生成字段的正文或忽略这些字段?