1

我有以下查询

@Override
public List<PlayerDetails> testPlayerQuerry() {
    return copyPlayersToDetails(em.createNativeQuery("select player_name from player p\n"
            + "join Player_Game pg on p.player_id = pg.fk_player_id\n"
            + "join Game g on pg.fk_game_id = g.game_id\n"
            + "where g.game_id = 2").getResultList());
}

据我所知,它返回字符串列表?由于我得到的错误

原因:java.lang.ClassCastException:java.lang.String 无法在 utils.SessionFacade.copyPlayersToDetails(SessionFacade.java:105) 处转换​​为实体。

抛出错误的类与返回播放器字符串的查询一起工作正常,例如从播放器返回 *

private List<PlayerDetails> copyPlayersToDetails(List< Player> players) {
    List<PlayerDetails> list = new ArrayList<PlayerDetails>();
    Iterator i = players.iterator();
    while (i.hasNext()) {
        Player player = (Player) i.next();
        PlayerDetails details = new PlayerDetails(player.getPlayerId(),
                player.getPlayerName(), player.getPlayerRating());
        list.add(details);
    }
    return list;
}

我必须如何转换此方法或如何(如果可能)将存储在此字符串列表中的这些值放入 JSF 页面,以便检索查询结果?

4

1 回答 1

1

您的copyPlayersToDetails()方法需要一个Player实体列表,而不是String. 这就是为什么你在ClassCastException这里得到一个:

Player player = (Player) i.next();

因为i.next()返回一个String. 您的 Java 编译器没有抱怨的原因是Query.getResultList()(不幸的是)返回了一个原始类型列表。

您应该将本机查询更改为:

@Override
public List<PlayerDetails> testPlayerQuerry() {
    return copyPlayersToDetails(em.createNativeQuery("select p.* from player p\n"
            + "join Player_Game pg on p.player_id = pg.fk_player_id\n"
            + "join Game g on pg.fk_game_id = g.game_id\n"
            + "where g.game_id = 2", Player.class).getResultList());
}

进一步的批评

  • 您应该(可能)使用绑定变量
  • 你不需要加入Game

改为这样写:

@Override
public List<PlayerDetails> testPlayerQuerry() {
    return copyPlayersToDetails(em.createNativeQuery("select p.* from player p\n"
          + "join Player_Game pg on p.player_id = pg.fk_player_id\n"
          + "where pg.fk_game_id = :1", Player.class).setParameter(1, 2).getResultList());
}
于 2016-01-07T22:26:24.653 回答