java - 按名称显示实体字段
问题描述
我在数据库中有很多字段的大型实体。我想形成一个仅包含选定字段的 excel 文档 - 我的意思是由用户选择。
@Data
@Entity
@Table(name = "ATTRIBUTE")
public class attribute {
@Column(name = "INN")
private String inn;
@Column(name = "OWNERSHIP")
private String ownership;
@Column(name = "NAME")
private String name;
//...
}
@PostMapping("/create")
public ResponseEntity<StreamingResponseBody> createDocument(@RequestBody List<String> attributes) {
//...
}
因此,在属性列表中可以是字段名称的任意组合 - “名称”、“所有权”等,因此,如果用户选择字段“名称”和“所有权”,那么在结果文档中应该只有这两个字段。明显的路径是使用反射api,这是相当简单的方法,但非常难看IMO。
public byte[] formDocument(Attribute attribute, List<String> fields) {
try (Workbook book = new XSSFWorkbook();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
Sheet sheet = book.createSheet();
Row row = createRow();
for (String field : fields) {
createCell(row, attribute, field);
}
book.write(outputStream);
return outputStream.toByteArray();
} catch (IOException e) {
throw new ExcelException();
}
}
//....
public Object getFieldValue(Attribute attribute, String fieldName) throws IllegalAccessException {
Optional<Field> requiredField = Arrays.stream(Attribute.class.getDeclaredFields())
.filter(field -> field.getName().equals(fieldName))
.findFirst();
if (requiredField.isPresent()) {
return requiredField.get().get(attribute);
} else {
throw new FieldNotFoundException();
}
}
像这样的东西。所以,我想问一下——有没有更清洁、更漂亮的方法呢?我想过一些 json 映射,但似乎并不好。谢谢你。
解决方案
推荐阅读
- google-cloud-platform - 如何将 autossh 与 google 计算一起使用(`gcloud compute ssh`)
- php - 获取 json 数据并保存会话?
- c++ - 如何声明比 CPU 机器大的紧凑型?
- css - 如何将一些 css 设置为 react NumPad 组件?
- angular - 如何正确拦截 REQUEST
- c# - 如何从 dialogBot.cs 调用各种子对话框?
- excel - 动态解析工作表中单元格中的文本
- java - Spring Boot API 的
- javascript - getter函数内部的AngularJS API调用
- web-scraping - 如何使用 wget 解决“无效的 URL http://:无效的主机名”