Spring Data JPA @Query使用UNION报列数不匹配异常如何优化
问题根因
- UNION 语法要求两侧查询返回的列数量、数据类型、字段顺序完全一致,你的SQL触发报错的原因如下:
- 两侧查询都写了
select *,会把JOIN的关联表字段全部返回:左侧查询关联Follower表,返回列数=Post表列数+Follower表列数;右侧查询关联user表,返回列数=Post表列数+user表列数,二者列数完全不匹配 - 你的方法返回类型是
List<Post>,仅需要Post表的字段,关联表的字段属于多余查询,没有实际作用
- 两侧查询都写了
修复方案
- 把两侧查询的返回字段统一限定为Post表的所有字段,把
select *改为select p.*,保证两侧返回列完全一致 - 补充
nativeQuery = true属性,标识这是原生SQL查询,否则JPA会按JPQL语法解析报错 - 可选优化:如果业务上不需要对合并后的结果去重,可以把
UNION改为UNION ALL,避免全局去重的性能开销
优化后的完整代码
@Query(value = """ select p.* from (select * from Post WHERE Post.id < :lastPostId) as p JOIN Follower f ON(f.to_id = p.user_id) WHERE f.from_id = :#{#currentUser.id} UNION select p.* from (select * from Post WHERE Post.id < :lastPostId) as p JOIN public.user u ON(u.group_id = :#{#currentUser.group.id}) """, nativeQuery = true) List<Post> getNewsFeedPosts(User currentUser, Long lastPostId);
内容的提问来源于stack exchange,提问作者user13505963
相关产品推荐
相关产品推荐

