【问题标题】:Retrieving data from native query and conversion从本机查询和转换中检索数据
【发布时间】:2016-04-12 11:57:32
【问题描述】:

我有以下查询

@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 无法转换为entities.Player 在 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 页面,以便检索查询结果?

【问题讨论】:

  • Constructor expressionsTuple queriesList&lt;Object[]&gt; 可以使用,当查询返回元组列表时,即不完全限定实体的列表,如给定查询所做的那样,即当需要选定的字段。 (可以使用 JPQL 或条件来重构给定的 SQL 查询。在这种情况下无需触发本机查询)。

标签: java jpa jpql nativequery


【解决方案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());
}

【讨论】:

  • 这完美!我还想知道如何从查询中检索具有其他实体数据的数据,例如存储在 Player_Game 表中的 gameScore?我在想我需要可以为我做到这一点的方法,或者我需要创建 PlayerGame 和 Game 对象来检索这些详细信息??
  • @DummyGummy:欢迎提出新问题。在 cmets 中谈论这将变得棘手......
  • 我需要等待 90 分钟才能发布下一个问题
  • @DummyGummy:好的。这让你有时间把它说得非常好:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2017-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多