Я работаю над веб-приложением, и одна из задач, которую мне нужно выполнить, - добавить функцию импорта в Excel, которая будет читать файл xlsx и преобразовывать его в список абстрактных классов.
Преобразовать его в класс легко, и существует множество учебных пособий о том, как это сделать, но в абстрактном классе их нет.
Абстрактный класс называется AbstractQuestion, который представляет вопросы, и существует несколько типов вопросов, таких как вопрос с одним выбором, вопрос с множественным выбором и текстовый вопрос.
По сути, каждая строка файла Excel может относиться к разным типам вопросов, и мне нужно вернуть список AbstractQuestion в конце. Более того, вопрос с несколькими вариантами ответов может иметь до 10 вариантов.
AbstractQuestion:
@SuppressWarnings("serial")
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "question_type", discriminatorType =
DiscriminatorType.STRING)
public abstract class AbstractQuestion implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name="code", nullable=false)
private String code;
@Column(name="question", nullable=false)
private String question;
@Version
private long version;
private @OneToMany(mappedBy="question")
List<AbstractAnswer> answers = new ArrayList<AbstractAnswer>();
public AbstractAnswer currentUserAnswer;
public AbstractQuestion() {
super();
// TODO Auto-generated constructor stub
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
public List<AbstractAnswer> getAnswers() {
return answers;
}
public void setAnswers(List<AbstractAnswer> answers) {
this.answers = answers;
}
public void putCurrentUserAnswer(AbstractAnswer answer) {
this.currentUserAnswer = answer;
}
public abstract void accept(QuestionVisitor q);
public abstract AbstractAnswer createAnswer(User user);
}
Текстовый вопрос:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("Text")
public class TextQuestion extends AbstractQuestion {
public TextQuestion() {
super();
}
@Override
public void accept(QuestionVisitor q) {
q.process(this);
}
public String getType() {
return QuestionUtility.TEXT_QUESTION;
}
@Override
public AbstractAnswer createAnswer(User user) {
TextAnswer answer = new TextAnswer();
answer.setAnswerer(user);
answer.setQuestion(this);
answer.setId(0);
answer.setVersion(0);
answer.setAnswered(false);
return answer;
}
}
Вопрос с одним выбором:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("SingleChoice")
public class SingleChoiceQuestion extends AbstractQuestion {
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
@JoinTable(name = "singlechoice_options", joinColumns = {
@JoinColumn(name= "parent" )
},inverseJoinColumns = {
@JoinColumn(name = "child")
}
)
private List<Option> options = new ArrayList<Option>();
public SingleChoiceQuestion() {
super();
// TODO Auto-generated constructor stub
}
@Override
public void accept(QuestionVisitor q) {
q.process(this);
}
public String getType() {
return QuestionUtility.SINGLE_CHOICE_QUESTION;
}
public List<Option> getOptions() {
return options;
}
public void setOptions(List<Option> options) {
this.options = options;
}
@Override
public AbstractAnswer createAnswer(User user) {
SingleChoiceAnswer answer = new SingleChoiceAnswer();
answer.setAnswerer(user);
answer.setQuestion(this);
answer.setId(0);
answer.setVersion(0);
answer.setAnswered(false);
return answer;
}
}
Вопрос с множественным выбором:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("MultipleChoice")
public class MultipleChoiceQuestion extends AbstractQuestion {
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
@JoinTable(name = "multiplechoice_options", joinColumns = {
@JoinColumn(name= "parent" )
},inverseJoinColumns = {
@JoinColumn(name = "child")
}
)
private List<Option> options = new ArrayList<Option>();
public MultipleChoiceQuestion() {
super();
// TODO Auto-generated constructor stub
}
@Override
public void accept(QuestionVisitor q) {
q.process(this);
}
public String getType() {
return QuestionUtility.MULTIPLE_CHOICE_QUESTION;
}
public List<Option> getOptions() {
return options;
}
public void setOptions(List<Option> options) {
this.options = options;
}
@Override
public AbstractAnswer createAnswer(User user) {
MultipleChoiceAnswer answer = new MultipleChoiceAnswer();
answer.setAnswerer(user);
answer.setQuestion(this);
answer.setId(0);
answer.setVersion(0);
answer.setAnswered(false);
return answer;
}
}
Опция:
@SuppressWarnings("serial")
@Entity
@Table(name = "option")
public class Option implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(name = "option", nullable=false)
private String option;
@Column(name = "weight", nullable=false)
private int weight;
@Version
private int version;
public Option() {
super();
// TODO Auto-generated constructor stub
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getOption() {
return option;
}
public void setOption(String option) {
this.option = option;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
}
А теперь давайте представим этот файл Excel:
файл xlsx
Цель - вернуть список AbstractQuestion. Возможно ли это сделать? Если так, как я могу это сделать? Любое возможное решение будет оценено.
Спасибо.