【问题标题】:Spring JPA Query. Join Table with @OneToMany properties春季 JPA 查询。使用 @OneToMany 属性连接表
【发布时间】:2021-07-31 05:56:55
【问题描述】:

我有以下两个模型:

class Game {

    private long id;
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<Team> teams;
    ...
}

class Team {
    private long id;
    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private Set<User> members;
    ...
}

用户模型持有String username。 现在我想创建一个查询,当我将游戏和用户名作为参数传递时,该查询会产生团队:

public interface TeamRepository extends Repository<Team, Long> {
    @Query("select t from Game g join Team t where g = :game and :username member of t.members")
    Team findTeamByUserInGame(Game game, String username);
}

但我不知道如何将 Game 表与 Team 表连接起来,以及如何检查用户名是否在成员中。有什么帮助吗?

【问题讨论】:

  • 你用 spring-data-jpa 和 spring-data-jdbc 标记了这个问题。是哪一个?

标签: sql spring spring-data-jpa


【解决方案1】:

如果加入,可以查询g.teams.members.username=:username

public interface TeamRepository extends Repository<Team, Long> {
    @Query("select g from Game g where g = :game and g.teams.members.username=:username")
    Team findTeamByUserInGame(Game game, String username);
}

【讨论】:

  • 您的意思是Game g join Team t 而不是Game g?因为没有变量“t”。而且 g.teams.username 也不存在。
  • 您不需要添加JOIN。 JPA 会自动加入。关于变量,它将是 g.teams.members.username
  • 我的 IDE 显示两个语法错误:“无法解析符号 t”和“无法解析符号“成员”。
  • 又一个小错误。您对 Game 的别名是 g。因此,您应该选择 g 即从 Game g 中选择 g 其中 g = :game 和 g.teams.members.username=:username
【解决方案2】:

以下作品:

@Query(value = "SELECT t FROM Game g join g.teams t where g = :game and exists (select m from g.teams join t.members m where m = :user)")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2017-06-25
    • 2023-03-06
    相关资源
    最近更新 更多