IllegalArgumentException w /通过查询访问mysql数据库

时间:2018-10-20 18:54:26

标签: java mysql

我正在尝试返回查询结果,但出现以下错误:

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,但我不知道如何以显示的方式转换它。

1 个答案:

答案 0 :(得分:0)

ResultSet.class调用中的createQuery表达式不是您使用此API的方式。在其中放入期望的类型,然后使用getSingleResult方法将返回的1行折叠到一个对象中。

但是在这段代码中,您是努力读取数据的人。因此,不要使用getSingleResult,只需照常获取结果集即可。我无法识别您在此处使用的DB API(例如,不清楚“ em”变量的类型是什么),因此您必须查看文档以了解如何执行此操作。应该很简单。