我正在尝试返回查询结果,但出现以下错误:
java.lang.IllegalArgumentException:无法使用请求的结果类型[java.sql.ResultSet]为具有多个返回的查询创建TypedQuery。
这是我的请求映射:
@RequestMapping(path="getAVGYTDStats.do", method =
RequestMethod.GET)
public ModelAndView getAvgYTDStats() throws SQLException {
ModelAndView mv = new ModelAndView();
List<Double> stats;
stats = housedao.getAvgPriceYTDStats();
System.out.println("stat after retrieval: " + "\n" + stats);
mv.addObject("stats", stats);
mv.setViewName("WEB-INF/views/stats.jsp");
return mv;
这是我的DAO访问器:
public List<Double> getAvgPriceYTDStats() throws SQLException {
String sql = "select avg(h.closedPrice), avg(h.soldConcessions)
from House h where h.closedDate>=\'2018-01-01\'";
ResultSet avgSalesYTD = em.createQuery(sql,
ResultSet.class).getSingleResult();
if (avgSalesYTD.next()) {
System.out.println(avgSalesYTD.getFloat(1));
System.out.println(avgSalesYTD.getFloat(2));
}
List<Double> stats = new ArrayList<Double>();
stats.add(avgSalesYTD.getDouble(1));
stats.add(avgSalesYTD.getDouble(2));
avgSalesYTD.close();
return stats;
}
我正在圈子里跑步,试图使其正常工作。它会编译,但会执行以上异常。
有什么建议吗?谢谢!
编辑:好的,我已经阅读了回复(谢谢!),并且“认为”我的工作进展得更好。这是我现在要做的:
public List<Double> getAvgPriceYTDStats() throws SQLException {
List<Double>stats =
em.createQuery(
"select avg(h.closedPrice), avg(h.soldConcessions) from
House h where h.closedDate>=\'2018-01-01\'")
.getResultList();
return stats;
}
我认为我在这里正在从我的RequestMapper调用方法/查询,请求一个Doubles列表,然后将该列表返回给Controller和RequestMapper。
然后,我将该对象添加到模型中,并在JSP上打印出来。
问题不在于String,但我不知道如何以显示的方式转换它。
答案 0 :(得分:0)
ResultSet.class
调用中的createQuery
表达式不是您使用此API的方式。在其中放入期望的类型,然后使用getSingleResult
方法将返回的1行折叠到一个对象中。
但是在这段代码中,您是努力读取数据的人。因此,不要使用getSingleResult
,只需照常获取结果集即可。我无法识别您在此处使用的DB API(例如,不清楚“ em”变量的类型是什么),因此您必须查看文档以了解如何执行此操作。应该很简单。