FrontPage > SAStrutsの覚書 > サンプルアプリ

外部SQLファイルによる検索

先に作成した検索処理を外部SQLファイルを使用するように 変更する。ついでに従業員番号も前方一致で検索するようにする。
外部SQLファイルの配置場所はエンティティクラスと同じパッケージ以下のエンティティクラスと同名のパッケージが推奨されているようだが、
ここではsrc/main/resourcesフォルダ以下のサービスクラスと同じパッケージに配置することとする。

1. 外部SQLファイル

src/main/resources以下の com.ziqoo.sassample.serviceパッケージへ
下記内容、EmpService_find.sqlというファイル名で外部SQLファイルを作成する。

EmpService_find.sql

select
	e.ID, e.EMP_NO, e.EMP_NAME
	,e.MGR_ID, e.HIREDATE, e.SAL, e.DEPT_ID, e.VERSION_NO
	,d.DEPT_NO, d.DEPT_NAME, d.LOC
from EMP e
	join DEPT d on e.DEPT_ID = d.ID
/*BEGIN*/
where
	/*IF empNoCondition != null && empNoCondition.length() > 0*/
		e.EMP_NO like /*empNoCondition*/'7%'
	/*END*/
	/*IF empNameCondition != null && empNameCondition.length() > 0*/
		and e.EMP_NAME like /*empNameCondition*/'A%'
	/*END*/
	/*IF hiredateMin != null*/
		and e.HIREDATE >= /*hiredateMin*/'1980-01-01'
	/*END*/
	/*IF hiredateMax != null*/
		and e.HIREDATE <= /*hiredateMax*/'2000-01-01'
	/*END*/
	/*IF deptIdCondition != null*/
		and e.DEPT_ID = /*deptIdCondition*/3
	/*END*/
/*END*/

2. SQLファイルパスの定数クラス作成

  • s2jdbc-gen-build.xmlファイルの修正
    下記の部分を
    <property name="sqlfilepattern" value="META-INF/sql/**/*.sql"/>
    以下のように変更する。
    <property name="sqlfilepattern" value="com/ziqoo/sassample/service/**/*.sql"/>
  • コマンドラインからプロジェクトルートに移動し、下記コマンドを実行する。
    ant -f s2jdbc-gen-build.xml gen-names
    すると、ルートパッケージのSqlFiles.javaに下記のように、作成したSQLファイルのパスが定数として定義される。
    public static final String SERVICE_EMP_SERVICE_FIND = "com/ziqoo/sassample/service/EmpService_find.sql";

3. 検索条件クラス修正

従業員番号を前方一致検索できるようにするため、SearchEmpConditionクラスの empNoプロパティの型をIntegerからStringに変更する。

	/** 従業員番号 */
	public String empNoCondition;

4. 検索結果格納用クラス作成

com.ziqoo.sassample.dto.SearchEmpDto.javaを作成する。
先に作成したSQLファイルを右クリック「Dolteng」→「新規DTOの作成」

5. Actionフォームクラスの修正

SearchEmpForm.javaのempListの型をList<SearchEmpDto>に変更する。

	/** 従業員検索結果 */
	public List<SearchEmpDto> empList;

6. Serviceクラス修正

EmpService.javaのfind()メソッドを以下のように修正する。

EmpService.java

   public List<SearchEmpDto> find(SearchEmpCondition condition) {
	if (StringUtil.isNotEmpty(condition.empNoCondition)) {
		condition.empNoCondition += "%";
	}
	if (StringUtil.isNotEmpty(condition.empNameCondition)) {
		condition.empNameCondition += "%";
	}
   	return jdbcManager.
   		selectBySqlFile(SearchEmpDto.class
   		,SqlFiles.SERVICE_EMP_SERVICE_FIND
   		,condition).getResultList();
   }

上記jdbcManager.selectBySqlFileの代わりに継承しているselectBySqlFile()メソッドを使用する場合は

  • SQLファイルを"META-INF/sql/Serviceクラスのジェネリクスで指定したエンティティクラスのパッケージ/エンティティクラスと同名のパッケージ/に配置する。
    今回の場合ではMETA-INF/sql/com/ziqoo/sassample/entity/Emp/以下
  • 下記のように引数としてSQLファイル名のみを直接指定する。
       public List<SearchEmpDto> find(SearchEmpCondition condition) {
    	if (StringUtil.isNotEmpty(condition.empNoCondition)) {
    		condition.empNoCondition += "%";
    	}
    	if (StringUtil.isNotEmpty(condition.empNameCondition)) {
    		condition.empNameCondition += "%";
    	}
       	return selectBySqlFile(SearchEmpDto.class
       		,"EmpService_find.sql"
       		,condition).getResultList();
       }

7. JSP修正

searchEmp.jsp検索結果一覧の以下の部分を

<td class="data">${emp.dept.deptName}</td>

以下のように修正する。

<td class="data">${emp.deptName}</td>

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-01-11 (水) 23:56:05 (2468d)