JPQL несколько объединений и коллекций - PullRequest
0 голосов
/ 24 января 2020

У меня есть игроки и игровые объекты, и я пытаюсь получить для каждого игрока все игры, в которые он играл, а также сколько правильных ответов он ответил, но ответы хранятся в третьей таблице с именем game_playeranswers (это коллекция) поэтому я должен выбрать его и посчитать правильные ответы. у game_playeranswers есть три столбца game_gameid, playeranswers и qid (id вопроса).

Я пытался это сделать, чтобы получить количество игроков и набор ответов, он возвратил 0 строк, но Х сыграл в 1 игру.

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

Сущность Game выглядит следующим образом

@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

}

Player выглядит следующим образом

@Entity
@Table()
public class Player {

    public Player() {

    }

    @Id
    private String userName;

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

    //Getters and Setters

}

1 Ответ

0 голосов
/ 24 января 2020

Я бы сказал, что проблемы начинаются не с технической проблемы создания правильного join (которая может или не может быть решена), а с недостатка дизайна. В этом случае было бы намного лучше держать объектную модель ближе к реляционной модели.

класс Game

Этот класс должен управлять деталями игры, а не фактической игрой. Это должно включать, например, категорию игры, но НЕ игрока или фактические ответы.

class GameInstance

Или подобное имя. Этот класс отсутствует в вашем решении и необходим для моделирования реальных игр. Каждый Game может иметь несколько (т. Е. Ноль или более) GameInstance с. Этот класс должен содержать игрока и другие данные, относящиеся к фактической игре.

класс Игрок

Должен содержать список GameInstance и НЕ Game.


При таком подходе некоторые отношения «многие ко многим» могут стать «один ко многим» .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...