功能的意思是:传一张试卷的ID给我,我统计出该张试卷的(时间,题目,分数);做成三张表给出卷人阅读,让他来判断这张试卷是否合适。(使用springmvc+openjpa)
而前台最主要的是行表头和列表头都不确定。所以在后台就要确定行和列,在用数据库查询的时候用distinct来把从表里面取到的数据去重;
行表头和列表头取到以后,其余的就是统计;根据当前试卷中的题目ID,行表头和列表头(条件并列);题目数用count函数,总时间用sum函数。统计出的数据以什么格式放?才能在前台用el表达式取出来呢?而且要和行表头和列表头对得上。
我先用Map(key,Value)放置每一个数据,key是列表头;然后放置在List中;在用一个Map(Key,Value)放置上一个List,Key就是行表头;最后在用一个List放置上一个Map这样前台取的时候遍历List用key取出行表头所在的那行数据,这样会得到一个List,而List里面又是一个Map在用列表头取出每列的数据这样就对应起来了。相当于
List<Map<Key,List<Map<Key,Value>>>>这样的结构。
最后还有一个合计功能,经过这个合计功能我也懂得了el表达式的另一种用法,就是在两个List中顺序相同的放置对应的值,在前台el遍历的时候可以通过设置varStatus这个值来取出另一个List中的值
把值放在ModelAndView里面,在前台取出。下面是部分源码:
后台
//设置返回对象
ModelAndView modelAndView = new ModelAndView("/paper/previewpsheet");
//定义试卷对象
Generatedpaper generatedpaper = null;
//获得问题列表
TypedQuery<Generatedpaper> query= EntityManagerHelper.createQuery("select o from Generatedpaper o where o.paperId=?1",Generatedpaper.class);
query.setParameter(1, paperId);
//试卷对象获取值
generatedpaper = query.getSingleResult();
Integer productId = generatedpaper.getProduct().getProductId();
//获取问题的集合
List<String> proIdList = Arrays.asList(generatedpaper.getProList().split(","));
List<String> scorePointList = Arrays.asList(generatedpaper.getPointsList().split(","));
//获取列标签
TypedQuery<Studylevel> colQuery = EntityManagerHelper.createQuery("select distinct o.problem.studylevel from ProductProblem o where o.id.productId = (?1) and o.id.proId in(?2)",Studylevel.class);
colQuery.setParameter(1, productId);
colQuery.setParameter(2, proIdList);
List<Studylevel> colList = colQuery.getResultList();
//获取行标签
TypedQuery<Difficulty> rowQuery = EntityManagerHelper.createQuery("select distinct o.problem.difficulty from