Top > SAStrutsあれこれ > 「データベースを使ったサンプル」を軽く改造(1)
#freeze
#contents

----
* 序 [#c1e985c8]
「データベースを使ったサンプル」の一覧画面は、以下のようになっていますが、

&ref(employee_hsqldb1.jpg);

これに「Department」を"f:label"を使用せずにDepartmentテーブルをSQLで結合して表示するようにしましょう。

改造対象のファイルは、
- sa-struts-tutorial\src\main\java\tutorial\service\EmployeeService.java&br;
- sa-struts-tutorial\webapp\WEB-INF\view\employee\index.jsp&br;
- sa-struts-tutorial\src\main\java\tutorial\action\EmployeeAction.java

* 改 [#l50e90c1]
** EmployeeService.java [#s8b4fcbe]
一覧表示メソッドのindex()を変更します。departmentテーブルを結合するには、
#code(java){{
.innerJoin("department")
}}
を追記すればOKです。"department"は、Employeeエンティティに定義されている↓
[code]
    /**
     * 部署です。
     */
    @ManyToOne
    public Department department;
}}
のDepartmentエンティティのプロパティ名のことになります。(参考[[S2JDBCマニュアル 結合:http://s2container.seasar.org/2.4/ja/s2jdbc_manager_auto.html#%E7%B5%90%E5%90%88]])

で、以下のようにメソッドを追加します。
#code(java){{
package tutorial.service;
import java.util.List;
import tutorial.entity.Employee;
 
public class EmployeeService extends AbstractService<Employee> {
    public List<Employee> findAllWithDept() {
        return select().innerJoin("department").orderBy("id").getResultList();
    }
}
}}

** EmployeeAction.java [#w2913df1]
呼び出すメソッドを変更しましょう。SQLでdepartmentを結合して取得するため、departmentテーブルのデータを個別に取得する必要はありません。

(変更前)
#code(java){{
    @Execute(validator = false)
    public String index() {
        empItems = employeeService.findAll();
        deptItems = departmentService.findAll();
        return "index.jsp";
    }
}}
↓
(変更後)
#code(java){{
    @Execute(validator = false)
    public String index() {
        //empItems = employeeService.findAll();
        //deptItems = departmentService.findAll();
        empItems = employeeService.findAllWithDept();
        return "index.jsp";
    }
}}

** index.jsp [#i052c3ad]
「Department」のtdタグ内容を変更します。Employeeエンティティのパラメータであるdepartmentエンティティのプロパティにアクセスするには、以下のように"."で連結すればOKです。

#code(jsp){{
<td>${f:h(e.department.name)}</td>
}}

(変更後)
↓
#code(jsp){{
<%@page pageEncoding="UTF-8" %>
<html>
<head>
<title>Tutorial: Employee List</title>
<link rel="stylesheet" type="text/css" href="${f:url('/css/sa.css')}" />

</head>
<body>
<h1>Tutorial: Employee List</h1>

<table border="1">
<tr style="background-color:pink">
<th>Id</th><th>Name</th><th>JobType</th><th>Salary</th><th>Department</th><th>編集</th>
</tr>
<c:forEach var="e" varStatus="s" items="${empItems}">
<tr style="background-color:${s.index %2 == 0 ? 'white' : 'yellow'}">
<td align="right">${f:h(e.id)}</td>
<td>${f:h(e.name)}</td>
<td>${f:h(e.jobType)}</td>
<td align="right"><fmt:formatNumber value="${e.salary}" pattern="#,##0"/></td>
<%-- <td>${f:label(e.departmentId, deptItems, "id", "name")}</td> --%>
<td>${f:h(e.department.name)}</td>
<td><s:link href="edit/${f:u(e.id)}">編集</s:link></td>
</tr>
</c:forEach>
</table>

</body>
</html>
}}

* 結果 [#s51d95f7]
結果は、↓のような感じになります。(見た目は変わらないのですが。。。)&br;
&ref(employee_hsqldb1.jpg);

* おまけ(結合カラム定義について) [#b7be357a]
アノテーション(@JoinColumn)により結合カラムを明示的に定義することもできます。(参考[[S2JDBCマニュアル:結合カラム定義:http://s2container.seasar.org/2.4/ja/s2jdbc_entity.html#%E7%B5%90%E5%90%88%E3%82%AB%E3%83%A9%E3%83%A0%E5%AE%9A%E7%BE%A9]])

EmployeeテーブルとDepartmentテーブルの結合カラムは、
Employee:DEPARTMENT_ID => Department:ID
となっていて、これは結合カラム名のデフォルトの命名規約に沿っているので、明示的に定義する必要はありませんが、もし明示的にすると以下のようになります。

#code(java){{
public class Employee {
    ...
    public Integer departementId;
    
    @ManyToOne
    @JoinColumn(name="DEPARTMENT_ID", referencedColumnName="id")
    public Department department;
}
}}

    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS