java - 在 Java Spring boot jpa 中将 List<Map<String, String>> 转换为对象

标签 java

我有一个如何转换的问题 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?

最佳答案

不要生成像 MapList 这样通用的东西,而是直接返回您的 JPA 实体。

所以转动这个:

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 您可以映射多个不同的拼写或缩写(如果您的规范允许此类事情),但为了获得最终的灵 active ,您可以使用正则表达式执行 if/else。 也可以完全取消 header 并使其基于索引(switch on colIdx)。

当然,您可以保持代码不变并将上述内容写入新的转换函数,例如:

List<Branch> convert(List<Map<String,String>> content) {
    return content.stream().map(this::convert).collect(Collectors.toList());
}
Branch convert(Map<String,String> props) {
    Branch branch = new Branch();
    for(String key : props.keySet()) {
        String value = props.get(key);
        switch(key) {
             case "Description": {
                  branch.setDescription(value);
                  break;
             }
             case "name": //example with multiple headers mapping to same field
             case "Label": {
                  branch.setLabel(value);
                  break;
             }
        }

    }
    return branch;
}

这可能是最简洁的选项(尽管您仍然希望删除空行和单元格创建代码)。

关于java - 在 Java Spring boot jpa 中将 List<Map<String, String>> 转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58977673/

相关文章:

java - com.liferay.portal.kernel.scheduler.SchedulerEngine : PORTLET_ID cannot be resolved or is not a field

java - 在 Android 中定期从服务器获取数据(轮询)

java - 如何在后台继续运行蓝牙 Activity ?

java - 如何将数据预填充到表中?

java - 有什么办法可以让程序将文本文件中的 "\n"识别为换行码?

java - 取消 Callable 实现无法正常工作

java - 调整 JTable 列的宽度

java - 如何使用 java spring 框架将多行从 Web 表单插入数据库

java - 在不使用 QueryString 的情况下将变量从一个网站页面传递到另一个网站页面

java - 在循环 Java 7 中转换泛型类型