我有一个问题,如何将List<Map<String, String>>
转换为自定义类对象以将其保存到JPA。如果我应用branchRepository.save(content)
,它将不起作用。
这是我的代码:
-BranchService.java-
public List<Map<String, String>> uploadEmployee(MultipartFile multip) throws Exception {
String fileNames = multip.getOriginalFilename();
DataFormatter formatter = new DataFormatter();
File file = new File("./reports/" + fileNames);
Workbook workbook = WorkbookFactory.create(file);
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
Sheet sheet = workbook.getSheetAt(0);
int headerRowNum = sheet.getFirstRowNum();
Map<Integer, String> colHeaders = new HashMap<Integer, String>();
Row row = sheet.getRow(headerRowNum);
for (Cell cell : row) {
int colIdx = cell.getColumnIndex();
String value = formatter.formatCellValue(cell, evaluator);
colHeaders.put(colIdx, value);
}
List<Map<String, String>> content = new ArrayList<Map<String, String>>();
for (int r = headerRowNum + 1; r <= sheet.getLastRowNum(); r++) {
row = sheet.getRow(r);
if (row == null)
row = sheet.createRow(r);
Map<String, String> valuesToHeaders = new HashMap<String, String>();
for (Map.Entry<Integer, String> entry : colHeaders.entrySet()) {
int colIdx = entry.getKey();
Cell cell = row.getCell(colIdx);
if (cell == null)
cell = row.createCell(colIdx);
String cellValue = formatter.formatCellValue(cell, evaluator);
valuesToHeaders.put(entry.getValue(), cellValue);
}
content.add(valuesToHeaders);
}
workbook.close();
System.out.println(content);
return content;
}
如何转换并将其应用于JPA?
答案 0 :(得分:1)
直接生成您的JPA实体,而不是生成List
中的Map
这样通用的东西。
所以转这个:
List<Map<String, String>> content = new ArrayList<Map<String, String>>();
for (int r = headerRowNum + 1; r <= sheet.getLastRowNum(); r++) {
row = sheet.getRow(r);
if (row == null)
row = sheet.createRow(r);
Map<String, String> valuesToHeaders = new HashMap<String, String>();
for (Map.Entry<Integer, String> entry : colHeaders.entrySet()) {
int colIdx = entry.getKey();
Cell cell = row.getCell(colIdx);
if (cell == null)
cell = row.createCell(colIdx);
String cellValue = formatter.formatCellValue(cell, evaluator);
valuesToHeaders.put(entry.getValue(), cellValue);
}
content.add(valuesToHeaders);
}
更像这样:
List<Branch> content = new ArrayList<>();
for (int r = headerRowNum + 1; r <= sheet.getLastRowNum(); r++) {
row = sheet.getRow(r);
if (row == null)
continue; //SKIP, don't bother creating empty stuff!
Branch branch = new Branch();
for (Map.Entry<Integer, String> entry : colHeaders.entrySet()) {
int colIdx = entry.getKey();
Cell cell = row.getCell(colIdx);
if (cell != null) {
String cellValue = formatter.formatCellValue(cell, evaluator);
switch(entry.getValue()) {
case "Description": {
branch.setDescription(cellValue);
break;
}
case "name": //example with multiple headers mapping to same field
case "Label": {
branch.setLabel(cellValue);
break;
}
}
//alternatively use if-else block with regex matching or some other technique to map your headers to JPA entity fields
}
}
content.add(branch);
}
使用switch
可以映射多个不同的拼写或缩写(如果您的说明允许这种情况),但是为了获得最大的灵活性,可以使用正则表达式。
也有可能完全不使用标头并使该索引基于{{1}上的switch
)。
当然,您可以按原样保留代码,并将上面的代码写到新的convert函数中,例如:
colIdx
这可能是最整齐的选项(尽管您仍然要删除空行和单元格创建代码)。
答案 1 :(得分:0)
如果作为结果列表元素的Map包含映射到其值的实体属性,则可以使用Gson来创建JPA实体的实例:
Gson gson = new Gson();
JsonElement jsonElement = gson.toJsonTree(map);
MyEntity pojo = gson.fromJson(jsonElement, MyEntity.class);