从本机查询和转换中检索数据 [英] Retrieving data from native query and conversion

查看:107
本文介绍了从本机查询和转换中检索数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下查询

@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());
}

据我所知,

哪个返回String的列表?由于错误,我得到

which as far as I am aware it return list of String? due to the error I am getting

由以下原因引起:java.lang.ClassCastException:java.lang.String无法强制转换为entity.Player 在utils.SessionFacade.copyPlayersToDetails(SessionFacade.java:105)

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to entities.Player at utils.SessionFacade.copyPlayersToDetails(SessionFacade.java:105)

抛出错误的类可以很好地用于查询,该查询返回播放器字符串,例如从播放器返回*

the class which throws the error it is working fine with queries which returns player String for example 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;
}

我该如何转换此方法,或者(如果可能)如何将存储在此String列表中的那些值保存到JSF页面中,以便检索查询结果?

How I have to convert this method or how (if possible) I can get those values stored in this String list in to JSF page so I can retrieve the query results?

推荐答案

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

Your copyPlayersToDetails() method expects a list of Player entities, not a list of String. This is why you get a ClassCastException here:

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

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

Because i.next() returns a String. The reason why your Java compiler didn't complain is because Query.getResultList() (unfortunately) returns a raw type list.

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

You should change your native query to this:

@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
  • Further criticism

    • You should (probably) use a bind variable
    • You don't need to join the 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());
      }
      

      这篇关于从本机查询和转换中检索数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆