You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JPQL查询最后10%页数无引用的图书问题求助

核心问题

现有JPQL存在两处问题:

  1. 逻辑偏差:只要图书下存在任意一条引用的页码小于总页数的90%就会返回该图书,未校验「整本书页码最大的引用是否落在最后10%页数区间」的核心规则
  2. 语法冗余: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:15:10