我知道有两种方法可以处理这个问题。
Option 1:使用Mapper类并指定要返回的List类型。
定义Mapper接口:
public interface TeamMapper {
CopyOnWriteArrayList<Team> getTeamsByGameID();
}
您的映射器 xml 文件保持不变。执行查询的代码更改为:
TeamMapper m = session.getMapper(TeamMapper.class);
List<Team> lt = m.getTeamsByGameID();
System.out.println(lt.getClass());
//=> prints out "class java.util.concurrent.CopyOnWriteArrayList"
Option 2:创建一个 ResultHandler 并将其传递到session.select()
method.
这里使用 ResultHandler 接口。该接口要求您重写一个方法,handleResult
,它给出了查询进行时从数据库返回的每个结果。
在你的例子中,你的 ResultHandler 看起来像这样:
public class TeamResultHandler implements ResultHandler {
private List<Team> teams = new CopyOnWriteArrayList<Team>();
@Override
public void handleResult(ResultContext rc) {
countries.add((Team) rc.getResultObject());
}
// provide a getter so you can retrieve it when finished
public List<Team> getTeamList() {
return teams;
}
}
而不是使用selectList
正如您上面所做的那样,您现在可以使用session.select(String, ResultHandler)
,像这样:
TeamResultHandler rh = new TeamResultHandler();
session.select("getTeamsByGameID", rh);
List<Team> lt = rh.getTeamList();
return lt;
此解决方案比您的解决方案更详细(需要一个额外的类和查询代码中的三行,而不是 2 行),但它只创建一个列表,而不是两个,因此您必须决定哪一个最适合您的需求。
此外,ResultHandlers 对于其他事情也很有用 - 确保结果以某种方式排序或过滤或其他方式,以防万一您需要。