使用外键的JPQL查询

问题描述 投票:0回答:1

我有玩家和游戏桌,我试图让他们在特定时间段内玩过的玩家,所以我尝试将查询写入游戏桌,因为它具有来自玩家实体的玩家名字作为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() {}
}
java jpa-2.0
1个回答
0
投票

userName不是Game实体的一部分。 Player playerGame实体的一部分-这就是为什么它会向您抛出有关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>)]

© www.soinside.com 2019 - 2024. All rights reserved.