从本机查询和转换中检索数据
Retrieving data from native query and conversion
我有以下查询
@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());
}
据我所知是哪个 return 字符串列表?由于我得到的错误
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to entities.Player
at utils.SessionFacade.copyPlayersToDetails(SessionFacade.java:105)
抛出错误的 class 它可以很好地处理 returns player String 例如 return * from players
的查询
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 页面中以便检索查询结果?
您的 copyPlayersToDetails()
方法需要一个 Player
实体列表,而不是 String
列表。这就是你在这里得到 ClassCastException
的原因:
Player player = (Player) i.next();
因为i.next()
returns一个String
。 Java 编译器没有报错的原因是 Query.getResultList()
(不幸的是)returns 原始类型列表。
您应该将本机查询更改为:
@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
table
改为这样写:
@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());
}
我有以下查询
@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());
}
据我所知是哪个 return 字符串列表?由于我得到的错误
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to entities.Player at utils.SessionFacade.copyPlayersToDetails(SessionFacade.java:105)
抛出错误的 class 它可以很好地处理 returns player String 例如 return * from players
的查询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 页面中以便检索查询结果?
您的 copyPlayersToDetails()
方法需要一个 Player
实体列表,而不是 String
列表。这就是你在这里得到 ClassCastException
的原因:
Player player = (Player) i.next();
因为i.next()
returns一个String
。 Java 编译器没有报错的原因是 Query.getResultList()
(不幸的是)returns 原始类型列表。
您应该将本机查询更改为:
@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
table
改为这样写:
@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());
}