Database 如何将数据库条目加载到scala模板中?
我正在使用play 2.3.8构建一个程序,您可以在其中提问并回答问题。我有几个不同的用户,所以我使用他们唯一的电子邮件作为数据库中的ID 问题/答案有自己的ID,以显示谁编写了它们 我的用户存储在数据库中,如下所示:Database 如何将数据库条目加载到scala模板中?,database,scala,playframework,Database,Scala,Playframework,我正在使用play 2.3.8构建一个程序,您可以在其中提问并回答问题。我有几个不同的用户,所以我使用他们唯一的电子邮件作为数据库中的ID 问题/答案有自己的ID,以显示谁编写了它们 我的用户存储在数据库中,如下所示: Email Name Password bob@mail.com Bob secret QUESTION_ID QUESTION_TEXT VOTE_SCORE OWNER
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
我的问题存储在数据库中,如下所示:
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
My controller类,它从DB收集问题/答案并将列表发送到view类:
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));
}
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;
(...)
}
@实体
公共类问题扩展模型的实现{
@身份证
公共字符串问号;
公共字符串文本;
公共整数voteScore;
公共字符串所有者ID;
公共整型页面;
(...)
}
在我的视图类中,我通过使用@answer.ownerID
..向用户显示问题及其背后的内容。。。但是,当我使用电子邮件字段作为ID时,条目类似于:
“身高有多高?”-bob@mail.com
我想要的是:
“身高有多高?”-Bob Ross
(使用他们的名字,而不是他们的电子邮件)
我知道我可以简单地在我的控制器中找到所有问题及其所有者,并将用户放入另一个列表,从中我将使用@users.username
,但这意味着我必须始终查找所有用户,将他们放入列表
那么,是否可以查看数据库,使用ownerID并在view类中获取用户名
或者更一般:您可以从视图类本身查找视图类的DB条目吗?您可以使用JPA 2.0添加映射以实现视图中所需的内容,然后可以使用
@question.owner.name
或@answer.owner.name
User.java
如何存储与电子邮件相关的用户名?您需要的是SQL连接操作。如何从数据库中获取答案?如果您发布一些到目前为止所拥有的代码,这将非常有用。(+1代表Bob Ross)@nbz:我添加了如何在数据库中存储用户,这对您有帮助吗?@Roman:我添加了代码。我确实省略了我的代码,因为我的问题更一般,我不想混淆。你是说像ScalaAnorm这样的东西?ScalaAnorm实际上只是一个抽象层,用于简化对底层数据库系统的访问。假设你用的是Eben,我真的帮不了你。我相信有人会回答这个问题。同时,阅读sql,特别是sql查询和连接,可能是一个好主意。嘿,谢谢你的回答。我似乎没有把我的问题表达得足够精确,所以我添加了我的类。尽管如此,你的回答帮助我找到了正确的方向,但是你能解释一下其中的几句话吗?这样我才能更好地理解它,并且可能适合我的问题?特别是获取和级联行,为什么要这样做?用注释更新了我的答案。对于fetch,我们希望控制JPA何时查询我们的对象,就像我们使用fetch.LAZY的用户一样,这样就不会立即查询对象,从而节省了我们的资源,而在问答时,我们需要fetch.eanger,因为我们将在视图中使用它。如果您需要在视图中提供问题的答案列表,因为它是惰性加载的,那么您需要使用它的getter来启动查询并在您的视图中提供它。对于级联,我们使用它将父级中使用的db操作相应地传播给子级。谢谢!现在我差不多明白发生了什么事。
[...]
@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;
[...]
[...]
@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;
[...]