【发布时间】:2021-01-30 21:34:49
【问题描述】:
我有一张玩家桌,我们称之为player。
假设它们有 3 列:userId (UUID in a varchar(255))、levelNumber (integer) 和一个与 FetchType.Lazy 一对一关系的列,假设为 facebookProfile。
我需要检索“围绕”玩家的排名,因此给定玩家上方的 9 个玩家和给定玩家下方的 9 个玩家,总共有 19 个玩家(我的玩家在中间)。
前段时间我刚想出这个主意:
(select * from player where current_level >= :levelNumber + 1 and (not userid = :userIdToIgnore) order by current_level asc limit 9)
union
(select * from player where current_level <= :levelNumber - 1 and (not userid = :userIdToIgnore) order by current_level desc limit 9)
你明白了。
有什么方法可以简化它,使其不使用 UNION?
我在问,因为我需要将其转换为 JPQL 查询,所以它不会是 nativeQuery。
这完全是因为nativeQueries 导致了N+1 问题,并且我在延迟加载(facebookProfile 列)和稍后的多项选择方面遇到了麻烦。这就是为什么我需要简化该算法以便能够使用 JPQL。
【问题讨论】:
-
我想删除联合并使其成为单选、使用连接选择或使用子选择进行选择。由于 JPQL 不支持 UNIONS,任何适用于 JPQL 的东西。
标签: postgresql select optimization lazy-loading jpql