JPQL-запрос с использованием внешнего ключа - PullRequest
1 голос
/ 23 января 2020

У меня есть игроки и игровые столы, и я пытаюсь получить игроков, в которых они играли, в определенный c период времени, поэтому я попытался записать запрос в игровой стол, так как он имеет имя игрока в виде fk из объект проигрывателя, но он не работает, и ошибка: путь к полю состояния 'g.userName' не может быть разрешен в допустимый тип.

String q1 =
    " select g.userName from Game g "
        + "where g.gameStart between '2019-11-10 00:00:00' and '2019-11-11 00:00:00'";
@Entity
@Table()
public class Game {

@Column() public Timestamp timestamp;
@Column() public Timestamp gameStart;
@Column() public Timestamp gameEnd;
@ElementCollection
@CollectionTable(joinColumns = @JoinColumn())
@MapKeyJoinColumn(name = "QID")
@Column()
public Map<Question, Boolean> playerAnswers = new LinkedHashMap<>();
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int gameID;
@ManyToMany private List<Category> choosenCategories = new ArrayList<>();
@ManyToMany private List<Question> questions = new ArrayList<>();
@Column() private int maxNumberOfQuestions;
@ManyToOne() private Player player;

}

//player
@Entity
@Table()
public class Player {
@Id private String userName;

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

public Player() {}
}

1 Ответ

1 голос
/ 23 января 2020

userName не является частью Game объекта. Player player является частью Game сущности - поэтому он выдает исключение о g.userName, которое не может быть разрешено.

Вы должны присоединиться к player сущности в своем запросе и получить userName от player.

Попробуйте следующее:

SELECT p.userName FROM Game g JOIN g.player p WHERE g.gameStart BETWEEN '2019-11-10 00:00:00' AND '2019-11-11 00:00:00' (обратите внимание, что этот запрос должен возвращать List<String>)

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