Отображение полей сущностей по именам

#java #excel #reflection

Вопрос:

У меня есть большая сущность со многими полями в базе данных. Я хотел бы сформировать документ 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, но это не кажется лучше.
Спасибо.

Комментарии:

1. На самом деле это не решение, а скорее совет, который мог бы помочь: взгляните на GraphQL graphql.org