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

如何用JPA实现User、Player、ChessGame三层关联的分层SELECT查询?

问题:通过CrudRepository查询关联ChessGame时SQL语法报错

实体关系

  • User实体包含:@OneToMany private final List<Player> players;
  • Player实体包含:@OneToOne private final ChessGame game;

需求

需要通过一次查询,从User表出发,关联其对应的Player列表,再通过Player的一对一关系获取所有关联的ChessGame(User的name字段为唯一标识)。

首次尝试代码

@Query("SELECT p.game FROM Player p WHERE p IN (SELECT u.players FROM User u WHERE u.name = :name)")
List<ChessGame> findUserGames(@Param("name") String name);

报错信息

应用编译通过,但执行查询时返回SQL语法错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '. from user user2_ cross join player players3_ where user2_.name=players3_.user_' at line 1

其他尝试的变体(均报错)

  1. 嵌套查询变体:
@Query("SELECT g FROM ChessGame g WHERE g IN (SELECT p.game FROM Player p WHERE p IN (SELECT u.players FROM User u WHERE u.name = :name) )")
  1. 子查询作为数据源(编译器不接受):
@Query("SELECT p.game FROM (SELECT u.players FROM User u WHERE u.name = :name) p")

补充疑问

我希望用最高效的方式实现该查询,不想通过代码逻辑实现(数据库查询效率更高),但担心使用Join会损失部分最优效率。该查询需要遍历三张表,但无需合并列,是否可以不使用Join实现?问题到底出在哪里?

内容的提问来源于stack exchange,提问作者dbrewster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:22:28