2017-10-23 28 views
2

私はフレームワークを休止するのが非常に難しく、netbeans IDEのHibernateフレームワークプロジェクトに取り組んでいます。私はプロジェクトに接続されているjavadbを持っており、各従業員のタスクリストを取得し、各従業員の名前に対して<td>の箇条書きリストとして表示する必要があります。以下は、EmployeeHelperクラスのgetEmployeeDetailsメソッドを使用してフェッチされている従業員の名前と役割を表示するテーブルです。テーブルからデータベースから取得した値を表示

問題
- コントローラーから渡されたresultTaskListパラメーターを呼び出しても、タスクリストは常に空です。
- 私は、従業員の名前に基づいてグループ化するタスクをリストするネストされたforloop内のタスクに対してif条件付きチェックを行う必要があることを知っています。しかし、jspページ内でifを実行する方法がわかりません。

同じテーブル内に各従業員のタスクリストを表示する方法についてのご意見は高く評価されます。

この表では、各従業員に関連するタスクを対応する<td>内の箇条書きリストとして作成したいと考えています。

Table

Employee.jsp

... 
<div class="content"> 
<!--Display table of roles with an edit button against each role--> 
<form method="get" action="<%= request.getContextPath() %>/RoleController"> 
    <br> 

    <table border ="2"> 
     <thead class="thead-inverse"> 
      <tr> 
       <th></th> 
       <th>Employee Name</th> 
       <th>Role</th> 
       <th>Tasks</th> 
       <th>Edit</th> 
      </tr> 
      </thead> 
      <tbody> 
      <c:forEach items="${result}" var="res"> 
       <tr> 
        <th scope="row"> 
        </th> 
        <td> 
         <c:out value="${res[0]}"></c:out> 
        </td> 
        <td> 
         <c:out value="${res[1]}"></c:out> 
        </td> 
        <td> 
         <c:out value="${resultTaskList[1]}"></c:out> 
        </td> 
        <td> 
         <input type="button" class="btn btn-info" value="Edit Role"> 
        </td> 
       </tr> 
      </c:forEach> 
    </table> 
</form> 
</div> 
... 

EmployeeController.java

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    EmployeeHelper helper = new EmployeeHelper(); 
    List<Employee> resultTaskList = helper.getEmployeeTasks(); 
    request.setAttribute("resultTaskList", resultTaskList); 
    List<Employee> result = helper.getEmployeeDetails(); 
    request.setAttribute("result", result); 
    request.getRequestDispatcher("Employee.jsp").forward(request, response); 
} 

EmployeeHelper.java

public class EmployeeHelper { 
    Session session = null; 

    public EmployeeHelper(){ 
     this.session = HibernateUtil.getSessionFactory().openSession(); 
    } 


    public List getEmployeeDetails(){ 
     Transaction tx = this.session.beginTransaction(); 

     List<Employee> employeeList = null; 

     try{ 
      Query query = session.createQuery("select e.name, r.title from Employee as e, Role as r where e.employeeid=r.employeeid"); 
      employeeList = (List<Employee>)query.list(); 
      tx.commit(); 
     } 
     catch(HibernateException ex){ 
      ex.printStackTrace(); 
      tx.rollback(); 
     } 
     return employeeList; 
    } 

    public List getEmployeeTasks(){ 
     Transaction tx = this.session.beginTransaction(); 

     List<Employee> employeeTaskList = null; 

     try{ 
      Query query = session.createQuery("select e.name, t.description from Employee as e, Role as r, Task as t, EmployeeTask as et where e.employeeid=r.employeeid and t.taskid=et.taskid and e.employeeid=et.employeeid"); 
      employeeTaskList = (List<Employee>)query.list(); 
      tx.commit(); 
     } 
     catch(HibernateException ex){ 
      ex.printStackTrace(); 
      tx.rollback(); 
     } 
     return employeeTaskList; 
    } 
} 

SQLクエリではなく、リストemployeeTaskListの

image

+0

従業員情報**と**の両方を含むオブジェクトを保持するリストである結果を作成する必要があります。現時点では2つの無関係なリストがあります –

+1

Hibernateは、リレーショナルデータベースをオブジェクトモデルにマッピングし、エンティティ間の(IDではなく)関連付けを完全に欠いています。問合せでは従業員を取得するだけで、JSPにはemployee.name、employee.role.titleが表示され、employee.tasksを反復して従業員の各タスクの説明が表示されます。したがって、従業員は、役割を持つManyToOneの関連付けと、タスクを持つOneToManyまたはManyToManyの関連付けを持つ必要があります。 –

+0

私はかなり冬眠するのがとても新しいです。だから私がどこに間違っているのか正確に回答サンプルを提供することができます。事前に感謝 –

答えて

0

getEmployeeTasks()方法内で実行されるには、リストを使用してループを反復処理し、コードを次のよう試みる従業員リストに値を設定します。 JB Nizetにより示唆されるように

public List getEmployeeTasks(){ 

    Transaction tx = this.session.beginTransaction(); 

    List<Employee> employeeTaskList = null; 

    try{ 
     session.beginTransaction(); 
     Query query = session.createQuery("select e.name, t.description from Employee as e, Role as r, Task as t, EmployeeTask as et where e.employeeid=r.employeeid and t.taskid=et.taskid and e.employeeid=et.employeeid"); 
     List<Object[]> result = (List<Object[]>) query.list(); 

    if (null != result && result.size() != 0) { 

      for (Object[] obj : result) { 
       //Set values over here 
       employeeTaskList.set..... 
      } 
     tx.commit(); 
    } 
    } 
    catch(HibernateException ex){ 
     ex.printStackTrace(); 
     tx.rollback(); 
    } 
    return employeeTaskList; 
} 
+0

返信Tejalに感謝します。しかし、 '​​'は最初のリストに基づいて動的に作成されるので、ここで 'employeeTaskList.set ...'をどうやってやるべきでしょうか? –

+0

上記のforループでemp = new Employee()を作成し、objectの値を設定してemployeeTaskListに追加します。 – Tejal

0

これら二つのリストは、非関連しています。それでもあなたはこのようなことをすることができます。

 <c:forEach items="${result}" var="res"> 
      <tr> 
       <th scope="row"> 
       </th> 
       <td> 
        <c:out value="${res[0]}"></c:out> 
       </td> 
       <td> 
        <c:out value="${res[1]}"></c:out> 
       </td> 
       <td> 
       <c:forEach items="${resultTaskList}" var="resultTaskList"> 
        <c:if test = "${res[0] == resultTaskList[0]}"> 
        <c:out value="${resultTaskList[1]}"></c:out> 
        </c:if> 
       </c:forEach> 
       </td> 
       <td> 
        <input type="button" class="btn btn-info" value="Edit Role"> 
       </td> 
      </tr> 
     </c:forEach> 

これが役に立ちます。

+0

ありがとうAkshay。これはまさに私がやりたいことであり、これはうまくいくはずです。しかし、私がこれを試してみると、何も表示されていません。だから私は 'resultTaskList'によって返された結果の数をテストしようとしました。それは0です.SQLとして実行するとクエリが機能したので、これがうまくいかない理由を見つけることができません。どんな助けもありがとう。 –

+0

この回答を見て、正しいドライバを使用しているかどうかを確認してください。 https://stackoverflow.com/a/6841177/3270795 –

関連する問題