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