如何用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
其他尝试的变体(均报错)
- 嵌套查询变体:
@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) )")
- 子查询作为数据源(编译器不接受):
@Query("SELECT p.game FROM (SELECT u.players FROM User u WHERE u.name = :name) p")
补充疑问
我希望用最高效的方式实现该查询,不想通过代码逻辑实现(数据库查询效率更高),但担心使用Join会损失部分最优效率。该查询需要遍历三张表,但无需合并列,是否可以不使用Join实现?问题到底出在哪里?
内容的提问来源于stack exchange,提问作者dbrewster
相关产品推荐
相关产品推荐

