昨天做项目的时候遇到的问题,查询删除都是好的,保存死活不入库,以下是代码部分:
/**
* 试题模版导入
*
* @param session
* @param response
* @param request
* @throws Exception
*/
@RequestMapping(value = "/templateImport", method = RequestMethod.POST)
@ResponseBody
public String templateImport(@RequestParam(value = "file", required = false) MultipartFile file, HttpSession session,
HttpServletResponse response, HttpServletRequest request, ModelMap modelMap) {
List<Map<Question, List<String>>> questionAndOptionsList = new ArrayList<Map<Question, List<String>>>();// 定义试题和答案的map集合对象集
List<Row> rowList = new ArrayList<Row>();// 定义行对象
String libraryId = request.getParameter("libraryId");
if (StringUtils.isEmpty(libraryId)) {
modelMap.put("message", "未选择题库");
RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
return null;
}
try {
rowList = ExcelUtil.getRows(file, 1);
} catch (Exception e) {
modelMap.put("message", "解析模版出错");
RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
return null;
}
int dateNum = rowList.size();// 定义数据总条数
int addNum = 0;// 定义新增数据条数
int updateNum = 0;// 定义修改数据条数
for (int i = 0; i < rowList.size(); i++) {
Row row = rowList.get(i);
Question question = new Question();// 定义试题对象
List<String> questionOptionList = new ArrayList<String>();// 定义接收所有解析到的试题选项
int cellNum = row.getLastCellNum();// 获取总列数
String questionTypeId = null; // 定义转换之后的试题类型
// 获取所有试题列的值
String content = ExcelUtil.getStringCellValue(row.getCell(0));// 获取试题内容
String questionTypeName = ExcelUtil.getStringCellValue(row.getCell(1));// 获取试题类型(拿到的是中文,需要自己转换)
String answer = ExcelUtil.getStringCellValue(row.getCell(2));// 获取答案
String analysis = ExcelUtil.getStringCellValue(row.getCell(3));// 获取试题解析
/*
* 试题信息非空校验
*/
if (StringUtils.isEmpty(content)) {
modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题内容为空");
RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
return null;
}
if (StringUtils.isEmpty(questionTypeName)) {
modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题类型为空");
RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
return null;
} else {
// 解析试题类型为编码
switch (questionTypeName) {
case "单选题":
questionTypeId = Const.QUESTION_TYPE_ID_SINGLE;
break;
case "多选题":
questionTypeId = Const.QUESTION_TYPE_ID_MULTIPLE;
break;
case "判断题":
questionTypeId = Const.QUESTION_TYPE_ID_JUDGE;
break;
default:
break;
}
}
if (StringUtils.isEmpty(answer)) {
modelMap.put("message", "导入文件中第" + (i + 2) + "行的答案为空");
RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
return null;
}
/*
* 试题信息长度校验
*/
if (content.length() > 1000) {
modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题内容长度超出范围");
RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
return null;
}
if (answer.length() > 200) {
modelMap.put("message", "导入文件中第" + (i + 2) + "行的答案长度超出范围");
RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
return null;
}
if (analysis.length() > 500) {
modelMap.put("message", "导入文件中第" + (i + 2) + "行的试题解析长度超出范围");
RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.FALSE);
return null;
}
/*
* 校验通过之后设置question对象
*/
question.setContent(content);// 设置内容
question.setQuestionTypeId(questionTypeId);// 设置类型
question.setAnswer(answer);// 设置答案
question.setLibraryId(libraryId);// 设置题库
question.setAnalysis(analysis);// 设置解析
question.setDelFlag("0");// 设置删除标识(1、为删除0、为未删除)
/*
* 开始解析试题答案信息
*/
for (int j = 4; j < cellNum; j++) {// 定义从第5列开始解析答案信息,第5列之前都时试题信息
String questionOption = ExcelUtil.getStringCellValue(row.getCell(j));// 获取试题答案选项
if (!StringUtils.isEmpty(questionOption)) {// 判断试题选项是否为空,如果为空则不存储该选项,也不中断解析之后的选项列
questionOptionList.add(questionOption);
}
}
Map<Question, List<String>> map = new HashMap<Question, List<String>>();
map.put(question, questionOptionList);
questionAndOptionsList.add(map);
}
for (Map<Question, List<String>> questionAndOptions : questionAndOptionsList) {
Set set = questionAndOptions.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Question keyQuestion = (Question) iterator.next();
**questionService.save(keyQuestion);// 保存试题信息**
List<String> questionOptionsList = questionAndOptions.get(keyQuestion);// 获取该试题所有的选项
for (int j = 0; j < questionOptionsList.size() && j < 26; j++) {
String content = questionOptionsList.get(j);
char letterCapital = (char) (j + 65);// 将数字转换成对应的字母
QuestionOption questionOption = new QuestionOption();// 定义试题对象
questionOption.setContent(content);// 设置选项内容
questionOption.setQuestionId(keyQuestion.getId());// 设置试题ID
questionOption.setName(String.valueOf(letterCapital));// 设置选项编号(A、B、C...)
questionOption.setSortNum(String.valueOf(j));// 设置排序号
questionOption.setDelFlag("0");// 设置删除标识(1、为删除0、为未删除)
**optionService.save(questionOption);// 保存试题对象**
}
}
}
modelMap.put("message", "新增数据:" + addNum + "条,修改数据:" + updateNum + "条,失败:" + (dateNum - addNum - updateNum) + "条");
RequestResponseUtil.putResponseStr(session, response, request, modelMap, StringConstant.TRUE);
return null;
}
跟此方法同类下的保存方法是可以运行的,并且数据也能入库,上述方法没有出现任何错误,并且执行save之后对象ID也会自动生成,但就时不入库。