【问题标题】:JPQL query using a foreign key使用外键的 JPQL 查询
【发布时间】:2020-01-23 19:46:35
【问题描述】:

我有玩家和游戏桌,我试图获取他们在特定时间范围内玩过的玩家,所以我尝试将查询写入游戏桌,因为它的玩家名称是来自玩家实体的 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】:

    userName 不是Game 实体的一部分。 Player playerGame 实体的一部分 - 这就是为什么它会抛出有关 g.userName 无法解决的异常。

    您必须在查询中加入player 实体并从player 获取userName

    所以尝试以下方法:

    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&lt;String&gt;

    【讨论】:

    • 感谢它有效!你能帮忙解决这个问题吗:我想为每个玩家获取所有游戏的正确答案数量,但正确答案存储在另一个表(game_playeranswers)中,所以它需要两个连接还是如何连接?
    • 是的,您需要另外加入playeranswers 表。是的,该查询将包含两个 JOIN。多个 JOIN 绝对没有问题。
    • 这是我的尝试 select g.gameId, g.gameStart, g.gameEnd, pl.playerAnswers from Game g join g.playerAnswers pl join g.player p group by p.userName " 但现在我对 playeranswers 有类似的错误,因为它是一个集合
    • 那是因为您已将playerAnswers 定义为Map&lt;Question, Boolean&gt; playerAnswers。您必须将 in 定义为 PlayerAnswer 实体,就像您对 Player player 所做的那样,您还必须指定关系:@OneToMany/@ManyToOne/@OneToOne/@OneToMany。如果您的查询中有pl.playerAnswers,这意味着PlayerAnswer 中的实体应该是我怀疑您拥有的字段playerAnswers
    猜你喜欢
    • 2021-04-06
    • 2015-07-15
    • 2017-11-25
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多