【问题标题】:JPQL multiple joins and collectionsJPQL 多个连接和集合
【发布时间】:2020-05-10 06:03:12
【问题描述】:

我有玩家和游戏实体,我试图为每个玩家获取他玩过的所有游戏以及他回答了多少正确答案,但答案存储在名为 game_playeranswers 的第三个表中(它是一个集合)所以我必须选择它并计算正确的答案。 game_playeranswers 包含三列 game_gameid、playeranswers 和 qid(问题 id)。

我试过这个来获取游戏玩法和答案集合,它返回了 0 行,但 X 玩了 1 场比赛。

SELECT KEY(m), VALUE(m) FROM Game g JOIN g.playerAnswers m join g.player p where p.userName ='X'"

游戏实体如下

@Entity
@Table()
public class Game {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int gameID;

    @ElementCollection
    @CollectionTable(joinColumns = @JoinColumn())
    @MapKeyJoinColumn(name = "QID")
    @Column()
    public Map<TypePatternQuestions.Question, Boolean> playerAnswers = new LinkedHashMap<>();

    @ManyToMany
    private List<Category> choosenCategories = new ArrayList<>();

    @ManyToMany
    private List<Question> questions = new ArrayList<>();

    @Column()
    public Timestamp timestamp;

    @Column()
    public Timestamp gameStart;

    @Column()
    public Timestamp gameEnd;

    @Column()
    private int maxNumberOfQuestions;

    @ManyToOne()
    private Player player;

    //Getters and Setters

}

播放器如下

@Entity
@Table()
public class Player {

    public Player() {

    }

    @Id
    private String userName;

    @OneToMany(mappedBy = "player")
    private List<Game> games = new ArrayList<>();

    //Getters and Setters

}

【问题讨论】:

  • 您的应用中是否使用了 Spring 数据?
  • 不,我没有使用它

标签: java jpa jpa-2.0


【解决方案1】:

我想说,问题不是从创建正确的join 的技术问题开始的(可能会或可能不会解决),而是设计缺陷。在这种情况下,保持对象模型更接近关系模型会更好。

类游戏

这个类应该管理游戏细节,而不是实际玩过的游戏。这应该包括例如游戏类别,但不包括玩家或给出的实际答案。

类游戏实例

或类似的名称。您的解决方案中缺少此类,并且需要对实际玩过的游戏进行建模。每个Game 可能有多个(即零个或多个)GameInstances。这个类应该保存玩家和其他与实际玩过的游戏相关的数据。

类播放器

应持有GameInstance 而不是Game 的列表。


采用这种方法,一些多对多关系可能会变成一对多.

【讨论】:

    猜你喜欢
    • 2015-05-23
    • 2019-07-12
    • 2013-08-19
    • 2018-11-01
    • 2018-07-06
    • 2012-09-12
    • 1970-01-01
    • 2012-11-09
    • 2012-11-17
    相关资源
    最近更新 更多