使用JPQL查询最后10%页数无引用的图书问题求助
核心问题
现有JPQL存在两处问题:
- 逻辑偏差:只要图书下存在任意一条引用的页码小于总页数的90%就会返回该图书,未校验「整本书页码最大的引用是否落在最后10%页数区间」的核心规则
- 语法冗余:FROM子句同时声明实体和JOIN关联,属于不必要的写法
修正后的JPQL语句
直接使用子查询先获取单本图书所有引用的最大页码,再做条件判断即可:
@Query("SELECT b FROM Book b WHERE (SELECT MAX(q.pageNumber) FROM Quote q JOIN q.chapter c WHERE c.book = b) < (b.pageNumber * 0.9) ORDER BY b.title")
如果需要将没有任何引用的图书也纳入符合条件的结果集,可调整为如下写法:
@Query("SELECT b FROM Book b WHERE (SELECT MAX(q.pageNumber) FROM Quote q JOIN q.chapter c WHERE c.book = b) < (b.pageNumber * 0.9) OR (SELECT COUNT(q.id) FROM Quote q JOIN q.chapter c WHERE c.book = b) = 0 ORDER BY b.title")
逻辑说明
- 内层子查询会遍历当前图书的所有关联章节、关联引用,取出所有引用的最大页码值
- 外层判断该最大页码值小于图书总页数的90%,即所有引用都落在前90%的页数区间,最后10%页数不存在引用,完全匹配需求
- 无需额外加
DISTINCT关键字,外层遍历图书实体不会生成重复数据
内容的提问来源于stack exchange,提问作者Marc Woern
相关产品推荐
相关产品推荐

