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

标签 java jsp jpa jakarta-ee

基本上我现在所做的工作是为学校准备一些不同的 .jsp。 我可以添加类(class),也可以添加学生,也可以将学生添加到特定类(class)。我想了解的是如何只向学生显示用户(我)点击的特定类(class)。

        <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>

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

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

<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>

当我单击其中一个链接(也称为类(class)名称)时,我会转到另一个 .jsp 页面,其中当前列出了所有学生,即使他们不属于我单击的特定类(class)。

这就是我的 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());
}
回顾一下。我希望能够仅显示每个特定类(class)的学生,而不是所有类(class)的所有学生。感谢您的帮助:(

最佳答案

首先,我建议不要使用嵌入式 PK(除非您确实必须高度优化数据库模型,或者您无法更改现有模型,因为它不属于您的职责)。如果您添加一个简单的 ID(例如 tyoe Long)并在类(class) ID 和学生 ID 的字段上添加唯一约束,您将获得几乎相同的行为。它将需要数据库中更多的内存,但除非我们不讨论这个“连接表”中的大量行,否则这个额外的内存可以忽略不计。但您得到的返回是一个更容易处理的实体模型。

如果您想获取参加特定类(class)的所有学生,您可以为此编写一个简单的 JPQL 查询。

首先获取类(class)的引用资料。之后在 Kursinfo 中查询所有学生,其中类(class)等于您感兴趣的类(class)。基本上是这样的(它没有经过测试,可能包含小错误,但我想向您展示总体思路):

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();

关于java - 如何使用jpa从数据库中获取特定的id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37308408/

相关文章:

java - 我如何使用我的日期格式 yyyy-mm-dd 在我的选择框中列出月份值

java - 将 session 中存在的对象的值显示到jsp页面中

java - 为什么 JPA 双重插入子实体?

java - 为什么谷歌云存储文件的大小小于使用谷歌应用引擎 Java 上传的文件大小

jsp - 如何在 ant 中使用 jasper2 预编译 .jspf 文件

Hibernate 4 (Jboss as 7) 无法自动检测实体并插入 PersistenceUnit,导致 `unknown entity` 异常

java - 为什么 Spring Roo 给 persist() Propogation.REQUIRES_NEW

java - 在 Tree 中插入一个节点,每个节点有 2 个以上的子节点

java - 在 websphere 中启动应用程序时出现异常 java.lang.NoSuchMethodError : org/w3c/dom/Node. getTextContent()Ljava/lang/String

java - activeMq tcp 故障转移时如何处理连接失败