2016-05-18 12 views
1

基本的に私が今働いているのは、学校にはいくつかの.jspがあるということです。 私はコースを追加することができ、私は学生を追加したり、特定のコースに学生を追加することもできます。私が学びたいのは、ユーザー(私)がどのような特定のコースをクリックするのか、学生だけを見せていくことです。jpaを使ってデータベースから特定のIDを取得するには?

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

上記のフォームは、コース用と学生用の2つのドロップダウンリストです。たとえば、nr.3の学生をコースnr.5にデータベースに追加することができます。だから少なくともそれは働く..

私の次のステップは、特定のコースのための特定の学生を示しています。 私が持っているのは、クリック可能なリンクとしてすべてのコースをリストする1つの.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ページを取得します。

これは私のサーブレットの外観です。

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

おさらい。私はすべてのコースのすべての生徒ではなく、それぞれのコースに入っている生徒だけを見せたいと思っています。

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

が次にあなたがStudentFacade(開く必要があります。このような何かに似て - あなたはあなたのバックエンドでfindAllByCourseId(Long courseId)と呼ばれる方法(ないサーブレット)を実装する必要があり

+1

の音 - 追加それをインターフェイスに追加して独自のクエリを書く(または 'findAll()'リストから結果をフィルタリングする) – ochi

+0

これは私が必要としていたものです。私はそれを書く方法を理解できません。このバックエンドのものはすべて私にとって新しいものなので、私は暗闇の中でこの作業をするためにここで撮影します。私が使うことができるファサードからのファインド(id)メソッドがありますが、どのようにすればいいのか分かりません:(助けがあれば) – idkwat2do

+0

'find(id)'はIDを与えられた一人の学生を見つけるでしょう。私はあなたのためにそれを書くつもりはありませんが、私はあなたに答えのヒントを与えることができます – ochi

答えて

0

任意の助け:(をありがとうこれは私はわからないが、それはインターフェースことと、このメソッドに定義を追加することができますように:。。

最後
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); 
} 
+0

JPAを使用してすべての生徒を照会し、バックエンドでフィルタリングする必要があります。特定のコースでは30人の学生、多分20人の学生しかいない大学について考えてみてください。 – stg

+0

これは真実で公正なコメントです。これは最適な方法ではありません – ochi

1

私は(非常にデータベースモデルを最適化するか、それはあなたの責任の外にあるので、既存のモデルを変更することはできませんし、あなたが本当に持っていない限り)埋め込まれたPKを使用しないようお勧めしますまず第一に。シンプルなID(例:tyoe Long)を追加し、コースIDと学生IDのフィールドに固有の制約を追加すると、ほぼ同じ動作になります。データベースにはもっと多くのメモリが必要ですが、この「結合テーブル」の行が非常に多くのことについて話していない限り、この余分なメモリは無視できます。しかし、あなたが返すものは、はるかに扱いやすいエンティティモデルです。

特定のコースに参加しているすべての生徒を取得する場合は、そのための簡単なJPQLクエリを作成できます。

最初にコースの参照を取得します。 Kursinfoにあるすべての受講生を対象とした質問の後、あなたが興味を持っているコースと同じコースになります。基本的には(それがテストされていないとマイナーなバグが含まれているかもしれないが、私はあなたの一般的な考え方を示したいと思います)このように:あなたがあなた自身の `.findAllByCourseId(ロングcourseId)`メソッドを実装する必要がありますように

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(); 
関連する問題