Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 如何将数据库条目加载到scala模板中?_Database_Scala_Playframework - Fatal编程技术网

Database 如何将数据库条目加载到scala模板中?

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

我正在使用play 2.3.8构建一个程序,您可以在其中提问并回答问题。我有几个不同的用户,所以我使用他们唯一的电子邮件作为数据库中的ID

问题/答案有自己的ID,以显示谁编写了它们

我的用户存储在数据库中,如下所示:

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;
[...]