如何将数据库条目加载到我的 Scala 模板中?
How can I load database entries into my scala template?
我正在使用 play 2.3.8 并构建一个程序,您可以在其中提出问题并回答问题。我有几个不同的用户,所以我使用他们唯一的电子邮件作为数据库中的 ID。
问题/答案有一个 ownerID,以显示它们的作者。
我的用户是这样存储在数据库中的:
Email Name Password
bob@mail.com Bob secret
我的问题是这样存储在数据库中的:
QUESTION_ID QUESTION_TEXT VOTE_SCORE OWNER_ID PAGE
77b7f88a-41df-4d68-9f89-de508fce8f71 How tall is tall? 1228 bob@mail.com 1
我的控制器 class,它从数据库收集问题/答案并将列表发送到视图 class:
public static List<Question> questionListAll = new ArrayList<Question>();
public static List<Answer> answerListAll = new ArrayList<Answer>();
public static Result index() {
questionListAll.clear();
answerListAll.clear();
// Get all questions from DB
for (Question questionItem : Question.find.all()) {
questionListAll.add(questionItem);
}
// Get all answers from DB
for (Answer answerItem : Answer.find.all()) {
answerListAll.add(answerItem);
}
Collections.sort(questionListAll, Collections.reverseOrder());
Collections.sort(answerListAll, Collections.reverseOrder());
return ok(views.html.index.render(questionListAll, answerListAll));
}
User.java:
// FIXME Dont really save the password as String...
@Id
public String email;
public String name;
public String password;
(...)
Question.java:
@Entity
public class Question extends Model implements Comparable<Question> {
@Id
public String questionID;
public String questionText;
public Integer voteScore;
public String ownerID;
public Integer page;
(...)
}
在我看来 class 我通过使用 @answer.ownerID
来向用户显示问题及其背后的问题...但是当我使用电子邮件字段作为 ID 时,条目类似于:
"How tall is tall?" - bob@mail.com
我要的是:
"How tall is tall?" - Bob Ross
(使用他们的姓名而不是电子邮件)
我知道我可以简单地在我的控制器中找到所有问题及其所有者,然后将用户放入另一个列表,我会从那里使用 @users.username
,但这意味着我总是必须查找所有用户, 将它们放入列表中,...
那么是否可以查看数据库,使用 ownerID 并在视图中获取用户名 class?
或更笼统:您可以从视图 class 本身查找视图 class 的数据库条目吗?
您可以使用 JPA 2.0 添加映射以实现您想要的视图,然后您可以使用 @question.owner.name
或 @answer.owner.name
。
User.java
[...]
@Id
@Column(name="user_id")
public Long userId;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "owner", cascade = CascadeType.ALL)
public List<Question> questionList;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "owner", cascade = CascadeType.ALL)
public List<Answer> answerList;
[...]
Question.java
[...]
@Id
@Column(name="question_id")
public Long questionId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="user_id", nullable = false)
public User owner;
// @OneToMany: ORM join relationship, one Question to many Answers
// FetchType.LAZY: ORM will not fetch from db until you use it
// CascadeType.ALL: any changes to question will be propagated
// onQuestionDelete: all answers associated with the question will be deleted
// onQuestionUpdateAnswerList: any updates made will reflect on db
// mappedBy: Question object variable name on Answer object for ORM to make a connection
@OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL)
public List<Answer> answerList;
[...]
Answer.java
[...]
@Id
@Column(name="answer_id")
public Long answerId;
// FetchType.EAGER: ORM will fetch this from db when Answer is fetch
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="user_id", nullable = false)
public User owner;
// @ManyToOne: ORM join relationship, many Question to one Answer
// @JoinColumn: name, pk column name of Question; nullable false, required constraint;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="question_id", nullable = false)
public Question question;
[...]
我正在使用 play 2.3.8 并构建一个程序,您可以在其中提出问题并回答问题。我有几个不同的用户,所以我使用他们唯一的电子邮件作为数据库中的 ID。
问题/答案有一个 ownerID,以显示它们的作者。
我的用户是这样存储在数据库中的:
Email Name Password
bob@mail.com Bob secret
我的问题是这样存储在数据库中的:
QUESTION_ID QUESTION_TEXT VOTE_SCORE OWNER_ID PAGE
77b7f88a-41df-4d68-9f89-de508fce8f71 How tall is tall? 1228 bob@mail.com 1
我的控制器 class,它从数据库收集问题/答案并将列表发送到视图 class:
public static List<Question> questionListAll = new ArrayList<Question>();
public static List<Answer> answerListAll = new ArrayList<Answer>();
public static Result index() {
questionListAll.clear();
answerListAll.clear();
// Get all questions from DB
for (Question questionItem : Question.find.all()) {
questionListAll.add(questionItem);
}
// Get all answers from DB
for (Answer answerItem : Answer.find.all()) {
answerListAll.add(answerItem);
}
Collections.sort(questionListAll, Collections.reverseOrder());
Collections.sort(answerListAll, Collections.reverseOrder());
return ok(views.html.index.render(questionListAll, answerListAll));
}
User.java:
// FIXME Dont really save the password as String...
@Id
public String email;
public String name;
public String password;
(...)
Question.java:
@Entity
public class Question extends Model implements Comparable<Question> {
@Id
public String questionID;
public String questionText;
public Integer voteScore;
public String ownerID;
public Integer page;
(...)
}
在我看来 class 我通过使用 @answer.ownerID
来向用户显示问题及其背后的问题...但是当我使用电子邮件字段作为 ID 时,条目类似于:
"How tall is tall?" - bob@mail.com
我要的是:
"How tall is tall?" - Bob Ross
(使用他们的姓名而不是电子邮件)
我知道我可以简单地在我的控制器中找到所有问题及其所有者,然后将用户放入另一个列表,我会从那里使用 @users.username
,但这意味着我总是必须查找所有用户, 将它们放入列表中,...
那么是否可以查看数据库,使用 ownerID 并在视图中获取用户名 class?
或更笼统:您可以从视图 class 本身查找视图 class 的数据库条目吗?
您可以使用 JPA 2.0 添加映射以实现您想要的视图,然后您可以使用 @question.owner.name
或 @answer.owner.name
。
User.java
[...]
@Id
@Column(name="user_id")
public Long userId;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "owner", cascade = CascadeType.ALL)
public List<Question> questionList;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "owner", cascade = CascadeType.ALL)
public List<Answer> answerList;
[...]
Question.java
[...]
@Id
@Column(name="question_id")
public Long questionId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="user_id", nullable = false)
public User owner;
// @OneToMany: ORM join relationship, one Question to many Answers
// FetchType.LAZY: ORM will not fetch from db until you use it
// CascadeType.ALL: any changes to question will be propagated
// onQuestionDelete: all answers associated with the question will be deleted
// onQuestionUpdateAnswerList: any updates made will reflect on db
// mappedBy: Question object variable name on Answer object for ORM to make a connection
@OneToMany(fetch = FetchType.LAZY, mappedBy = "question", cascade = CascadeType.ALL)
public List<Answer> answerList;
[...]
Answer.java
[...]
@Id
@Column(name="answer_id")
public Long answerId;
// FetchType.EAGER: ORM will fetch this from db when Answer is fetch
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="user_id", nullable = false)
public User owner;
// @ManyToOne: ORM join relationship, many Question to one Answer
// @JoinColumn: name, pk column name of Question; nullable false, required constraint;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="question_id", nullable = false)
public Question question;
[...]