サポート > Wagby Developer Network > カスタマイズ事例 > 前方一致検索、後方一致検索を行う。
このカスタマイズ方法は不要になりました。Wagby R6.1 より、Wagby 定義ファイルで指定できます。
カスタマイズ要件
ここでは、Wagby が自動生成した SQL 文をカスタマイズする方法を説明します。 今回の要件は文字列の前方一致、後方一致検索を実現するというものです。
Wagby は内部で Hibernate という ORM (Object/Relational Mapping) ライブラリを利用しています。Hibernate では SQL に代わって HQL (Hibernate Query Language) を利用することになっていますが、これはほとんど SQL と同じ構文になっています。
カスタマイズ方法
- 自動生成された $(DEVHOME)\env\work\srcgen\jp\jasminesoft\wagby\app\customer\ShowListCustomerProcessBean.java ファイルを、$(DEVHOME)\customize\webpage\WEB-INF\src\jp\jasminesoft\wagby\app\customer\MyShowListCustomerProcessBean.java として保存します。接頭語に「My」を付与します。
フォルダ名は、ご利用になるパッケージ名により変わります。適切に読み替えてください。
- MyShowListCustomerProcessBean.java を編集します。
public class MyShowListCustomerProcessBean extends ShowListCustomerProcessBean { /** Logger クラスを準備します。 */ private final static Logger logger = Logger.getLogger( MyShowListCustomerProcessBean.class.getName()); /** * コンストラクタ * */ public MyShowListCustomerProcessBean() { super(); } /** * コンストラクタ * * @param p DbActionParameter */ public MyShowListCustomerProcessBean(DbActionParameter p) { super(p); } /** * HQL 文を生成します。 * * @param map パラメータが格納されたマップ。 * @return HQL 文。 */ protected boolean outputWhereMain( boolean isfirstexpression, StringBuilder sb, Map map) { // HQL 文の組み立てを開始します。 ... // name : String String _name = (String)map.get("name"); if (_name != null &&_name.length() > 0) { isfirstexpression = outputWhereConjuction(isfirstexpression, sb); if (_noselectionSet.contains("name")) { sb.append("( "); } sb.append("_customer_name_"); sb.append(" LIKE '%"); // 前方一致の場合、この % を除去する。 sb.append(SQLUtilities.replaceLikeSpecialChar(_name)); sb.append("%' "); // 後方一致の場合、この % を除去する。 if (_noselectionSet.contains("name")) { isfirstexpression = outputWhereConjuction(isfirstexpression, sb, "OR"); sb.append("_customer_name_"); sb.append(" IS NULL "); sb.append(") "); } } else if (_noselectionSet.contains("name")) { isfirstexpression = outputWhereConjuction(isfirstexpression, sb); sb.append("_customer_name_"); sb.append(" IS NULL "); } ... return isfirstexpression; } }- コンストラクタを用意します。その実装は、親クラスのコンストラクタ呼び出しとしてください。
- outputWhereMain メソッドをオーバーライドし、カスタマイズします。
Wagby は標準で「部分一致検索」または「完全一致検索」を提供します。
上記例のように、LIKE 直後の '%' を除去することで、「前方一致」となります。
sb.append(" LIKE '"); // 前方一致
sb.append(SQLUtilities.replaceLikeSpecialChar(_name));
sb.append("%' ");
また、その次の '%' を削除することで、「後方一致」となります。
sb.append(" LIKE '%");
sb.append(SQLUtilities.replaceLikeSpecialChar(_name));
sb.append("' "); // 後方一致
「完全一致」の場合は両方の '%' を除去し、LIKE 演算子を '=' 演算子に変更します。 このとき、SQLUtilities クラスの replaceLikeSpecialChar メソッドに代えて、replaceSpecialChar メソッドを使います。
sb.append(" = '");
sb.append(SQLUtilities.replaceSpecialChar(_name));
sb.append("' ");
SQLUtilities.replaceSpecialChar メソッドならびに SQLUtilities.replaceLikeSpecialChar メソッドは、SQL インジェクション対策として用意されているものです。
ビルド
変更したファイルのビルド方法については、「カスタマイズファイルの適用方法」をお読みください。
なお、カスタマイズされたヘルパコードの存在が認識されると、自動生成される bean 定義ファイル(work\srcgen\webpage\WEB-INF\applicationContext\customer.xml)は次のように変更されます。
<bean id="ShowListCustomerProcessBean"
class="jp.jasminesoft.wagby.app.customer.MyShowListCustomerProcessBean"/>
これによって、カスタマイズされたクラスが使われるようになることがわかります。
ダウンロード
このページで紹介したサンプルをダウンロードしてお試しいただくことができます。
- changesql.zip (465,322 byte)
同 zip ファイルには次のファイルが含まれています。
customize\webpage\WEB-INF\src\jp\jasminesoft\wagby\app\customer\MyShowListCustomerProcessBean.java xls-model\changesql.xls
ダウンロード後、次の手順に従ってお試しください。
- ダウンロードファイルを $(DEVHOME) に展開します。Wagby 定義ファイルならびにカスタマイズコードが上書きで配置されます。(なお、パッケージ名は「jp.jasminesoft.wagby」となっていますので、変更している方はご注意ください。)
- フルビルドを行います。
