我正在构建一个小型测验应用程序,并将每个问题的每个答案存储在数据库表中(使用JPA)。
我想知道是否有一种方法可以通过for循环动态获取getter(例如,使用javascript可能),而不必写出每个get方法。
我拥有的代码(其中“答案”是一个类,每个答案有9个不同的整数)。
public void parseUserScore(UserAnswers answer) {
Integer[] answers = new Integer[] {
answer.getQ1(),
answer.getQ2(),
answer.getQ3(),
answer.getQ4(),
answer.getQ5(),
answer.getQ6(),
answer.getQ7(),
answer.getQ8(),
answer.getQ9()
};
double totalscore = 0;
Integer answeredQuestions = 0;
for (int i = 0; i < answers.length; i++) {
if (answers[i] > 0) {
answeredQuestions++;
}
totalscore += answers[i];
}
}
我的问题是,是否有可能像这样通过foor循环获取这些答案:
public void parseUserScore(UserAnswers answer) {
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 10; i++) {
String methodname = "getQ" + i.toString();
list.add(i, answer.methodname)
}
}
这是可取的,因为我想使用每个问题的索引根据其各自的类别将其分开。
答案 0 :(得分:2)
根据您在问题中提供的内容,我认为您应该使用三个实体:User
,Question
和Answer
。用户可以提出多个问题并提交多个问题答案。答案总是属于一个问题。 JPA有一些注释可以为这些规则建模:
@Entity
class User {
@OneToMany(mappedBy = "user")
Set<Question> questions;
@OneToMany(mappedBy = "user")
Set<Answer> answers;
// Getters & setters
}
@Entity
class Question {
@ManyToOne
@JoinColumn(name = "user_id")
User user;
@OneToMany(mappedBy = "question")
Set<Answer> answers;
// Getters & setters
}
@Entity
class Answer {
@ManyToOne
@JoinColumn(name = "user_id")
User user;
@ManyToOne
@JoinColumn(name = "question_id")
Question question;
int score;
// Getters & setters
}
然后,您可以简单地迭代特定用户的答案并计算总得分:
final int totalScore = user.getAnswers().stream().mapToInt(Answer::getScore).sum();
请注意,这只是一个基本示例。您还应该考虑级联更新和获取关系类型。
关于您关于for循环的问题:Java提供了一个名为“ Reflection”的功能。它是元编程的一种机制,可用于实现您所描述的内容。但是,这是一个坏主意,因为它有一些缺点,并且在您的情况下没有意义,因为用户应该能够回答10个以上的问题。实际上,您不知道用户将提交多少个答案。