如何使用jpa从数据库中获取特定的id?

时间:2016-05-18 19:21:40

标签: java jsp jpa java-ee

基本上我现在的工作是为学校提供一些不同的.jsp。 我可以添加课程,我可以添加学生,也可以添加学生到特定的课程。我想学习的是如何仅向学生展示用户(我)点击的具体课程。

        <form action="http://localhost:8080/School/add" method="POST">
        Kurs:
        <select name="coursedrop">
            <c:forEach items="${allCourses}" var="course">
                <option value="${course.id}">${course.id}: ${course.coursename}</option>
            </c:forEach>
        </select>
        Student:
        <select name="studentdrop">
            <c:forEach items="${allStudents}" var="student">
                <option value="${student.id}">${student.id}: ${student.studentname}</option>
            </c:forEach>
        </select>
        <input type="submit" value="Add"/>
    </form>

上面显示的表格是两个下拉列表,一个用于课程,另一个用于学生。我可以将学生nr.3添加到我的数据库的课程nr.5。所以至少那个有用..

我的下一步是向特定学生展示他们的特定课程。 我所拥有的是一个.jsp页面,它将所有课程列为可点击链接。像这样:

<tbody>
    <c:forEach items="${allCourses}" var="course">
       <tr>
          <td><a href="http://localhost:8080/School/course?id=${course.id}">${course.coursename}</a></td>
       </tr>
     </c:forEach>
 </tbody>

当我点击其中一个名为coursenames的链接时,我会进入另一个目前列出所有学生的.jsp页面,即使它们不在我点击的特定课程中。

这就是我的servlet的样子。 (我很抱歉,如果它太可怕了)

    @Inject
SchoolBoundary sb;

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    String path = request.getServletPath();
    String redirect = "/home.jsp";
    String forward = null;
    switch(path) {
        case "/student":
            request.setAttribute("allStudents", sb.getAllStudents());
            forward = "/student.jsp";
            break;
        case "/course":
            request.setAttribute("allStudents", sb.getAllStudents());
            forward = "/course.jsp";
            break;
        case "/add":
            request.setAttribute("allCourses", sb.getAllCourses());
            request.setAttribute("allStudents", sb.getAllStudents());
            forward = "/add.jsp";
            break;
        case "/home":
            request.setAttribute("allCourses", sb.getAllCourses());
            forward = "/home.jsp";
            break;
        default:
            request.setAttribute("allCourses", sb.getAllCourses());
            forward = "/home.jsp";
    }
    request.getRequestDispatcher(forward).forward(request, response);

我可以看到我的“getAllStudents”将显示所有学生而不是id(这是我认为我需要但我不知道如何......)。 而我的“getAllStudents”来自我的边界:

    public Set<Student> getAllStudenter() {
    return new HashSet(studentFacade.findAll());
}

概括。我希望能够只展示每个特定课程的学生,而不是所有课程中的所有学生。感谢您的帮助:(

2 个答案:

答案 0 :(得分:1)

首先,我建议不要使用嵌入式PK(除非您真的必须高度优化数据库模型,否则您无法更改现有模型,因为它超出了您的职责范围)。如果添加简单ID(例如tyoe Long)并在课程ID和学生ID的字段上添加唯一约束,则会有几乎相同的行为。它将需要更多的内存在数据库中,但除非我们没有在这个&#34;连接表&#34;中讨论很多行。这种额外的记忆是可以忽略不计的。但是你获得的回报是一个更容易处理的实体模型。

如果您想让所有参加特定课程的学生参加,您可以为此编写简单的JPQL查询。

首先获得课程的参考。在Kursinfo之后所有学生的查询,其中课程等于您感兴趣的课程。基本上这样(它没有经过测试,可能包含小错误,但我想向您展示一般的想法) :

String query = "SELECT k.student FROM Kursinfo k WHERE k.kurs = :kurs";
TypedQuery<Student> q = entityManager.createQuery(query, Student.class);
q.setParameter("kurs", entityManager.getReference(kursId, Kurs.class));
return q.getResultList();

答案 1 :(得分:0)

您需要在后端(而不是servlet)中实现一个名为findAllByCourseId(Long courseId)的方法 - 类似于以下内容:

public Set<Student> findAllByCourseId(Long courseId) {
    return new HashSet(studentFacade.findAllByCourseId(courseId));
}

然后你需要打开StudentFacade(我不确定,但它可以是一个接口并为这个方法添加一个定义。喜欢:

Set<Student> findAllByCourseId(Long courseId);

最后,添加接口的实现(如果有)并实现新方法。有点像:

// filter the all list or use your own query
public Set<Student> findAllByCourseId(Long courseId) {
    // this is filtering
    List<Student> allStudents = findAll();
    List<Student> filteredList = new ArrayList<Student>();

    for(Student student : allStudents ){
        if( student.getCourseId() == courseId ){
           filteredList.add(student);
        }
    }

    return new HashSet(filteredList);
}