はじめに
前回の記事では、テーブルとフィールドクラスの作成、ページとフォームクラスの作成、ページクラスからのHTML作成といった流れで作業を行いました。前回の記事で作成したコードの大半は、dataforms.jarの開発ツールで生成したものです。開発ツールで作成したページは、記事テーブル(article)のみを操作するコードを生成します。この段階で、検索条件を指定して該当する記事のリストを表示し、そのリストから選択したレコードを編集するようなアプリケーションがそれなりに動作していますが、まだ実用的なレベルには達していません。そこで今回は検索処理を改善し、さらに添付ファイルテーブル(attach_file)の操作を追加していきます。
対象読者
この記事を読むために必要な知識は以下の通りです。
- Java
- JavaScript
- jQuery、jQuery UI
- HTML、CSS
- SQL
必要な環境
dataforms.jarを使用した開発では、以下のものを使用しています。
- JDK1.8
- Eclipse 4.5以上
- Tomcat 7以上
検索条件の調整
前回の記事ではArticleQueryFormには何も入力せず[検索]ボタンを押下し、全ての登録データを表示させました。今回は検索条件を入力して[検索]ボタンを押下してみます。
このような検索条件を指定した場合、ログを確認すると以下のSQLが発行されていることが確認できます。
2017-03-15 23:03:18,874 DEBUG SqlParser - parsedSql = select * from (select row_number() over() as row_no, m.* from (select m.article_id as article_id ,m.thread_id as thread_id ,m.title as title ,m.auther as auther ,m.contents as contents ,m.delete_flag as delete_flag ,m.create_user_id as create_user_id ,m.create_timestamp as create_timestamp ,m.update_user_id as update_user_id ,m.update_timestamp as update_timestamp from article as m where m.title = ? and m.auther = ? and m.delete_flag='0' order by m.article_id asc) as m) as m where (? + 1) <= m.row_no and m.row_no <= (? + 1) 2017-03-15 23:03:18,874 DEBUG SqlParser - 1 :title=タイトル1 2017-03-15 23:03:18,874 DEBUG SqlParser - 2 :auther=著者1 2017-03-15 23:03:18,874 DEBUG SqlParser - 3 :row_from=0 2017-03-15 23:03:18,874 DEBUG SqlParser - 4 :row_to=9
このSQLを見ると分かると思いますが、ArticleQueryFormに入力したタイトルと、著者で限定するwhere句が出力されていることが分かります。テーブルを検索するメソッドを以下に示します。
/** * QueryFormから入力された条件から、テーブルを検索し、指定されたページの情報を返します。 * @param data 条件データ。 * @param flist 条件フィールドリスト。 * @return 検索結果。 * @throws Exception 例外。 */ public Map<String, Object> queryPage(final Map<String, Object> data, final FieldList flist) throws Exception { Query query = new ArticleTableQuery(); query.setQueryFormFieldList(flist); query.setQueryFormData(data); String sortOrder = (String) data.get("sortOrder"); FieldList sflist = query.getFieldList().getOrderByFieldList(sortOrder); if (sflist.size() == 0) { query.setOrderByFieldList(query.getMainTable().getPkFieldList()); } else { query.setOrderByFieldList(sflist); } return this.executePageQuery(query); }
このメソッドではArticleTableQueryに対し、ArticleQueryForm中に配置されたフィールドのリストと、ArticleQueryFormで入力された検索条件を渡しています。この情報から、Queryクラスが自動的にwhere句を生成します。今回はタイトルと著者のみ入力され、本文が入力されていません。そのため生成される条件はタイトルと著者のみを限定するものとなっています。
実行されたSQLをよく見ると、タイトルや著者の条件式が完全一致になっています。これだと使い勝手が悪いので部分一致に変更します。「ArticleQueryForm.java」の以下の太字部分を修正します。
/** * コンストラクタ。 */ public ArticleQueryForm() { ArticleTable table = new ArticleTable(); this.addField(table.getTitleField()).setMatchType(MatchType.PART); this.addField(table.getAutherField()).setMatchType(MatchType.PART); this.addField(table.getContentsField()).setMatchType(MatchType.PART); }
この修正で、部分一致のSQLが生成されるようになります。
2017-03-16 18:13:03,602 DEBUG SqlParser - parsedSql = select * from (select row_number() over() as row_no, m.* from (select m.article_id as article_id ,m.thread_id as thread_id ,m.title as title ,m.auther as auther ,m.contents as contents ,m.delete_flag as delete_flag ,m.create_user_id as create_user_id ,m.create_timestamp as create_timestamp ,m.update_user_id as update_user_id ,m.update_timestamp as update_timestamp from article as m where m.title like ? {escape '\'} and m.auther like ? {escape '\'} and m.delete_flag='0' order by m.article_id asc) as m) as m where (? + 1) <= m.row_no and m.row_no <= (? + 1) 2017-03-16 18:13:03,603 DEBUG SqlParser - 1 :title=%タイトル% 2017-03-16 18:13:03,603 DEBUG SqlParser - 2 :auther=%著者% 2017-03-16 18:13:03,603 DEBUG SqlParser - 3 :row_from=0 2017-03-16 18:13:03,603 DEBUG SqlParser - 4 :row_to=9
フィールドに指定するMatchTypeは以下の表の通りです。条件式中の":field_id"は最終的に"?"に置換されて、パラメータマップ中の"fieldId"の値が設定されます。
MatchType | 生成される条件式 |
---|---|
MatchType.FULL |
完全一致の条件式を作成します。フィールドIDが"fieldId"の場合以下の条件式を生成します。 field_id = :field_id |
MatchType.PART |
部分一致の条件式を作成します。フィールドIDが"fieldId"の場合以下の条件式を生成します。 field_id like :field_id パラメータとして渡す値の前後に"%"を付加します。 |
MatchType.BEGIN |
先頭一致の条件式を作成します。フィールドIDが"fieldId"の場合以下の条件式を生成します。 field_id like :field_id パラメータとして渡す値の後に"%"を付加します。 |
MatchType.END |
末尾一致の条件式を作成します。フィールドIDが"fieldId"の場合以下の条件式を生成します。 field_id like :field_id パラメータとして渡す値の前に"%"を付加します。 |
MatchType.RANGE_FROM |
範囲開始の条件式を作成します。フィールドIDが"fieldIdFrom"の場合以下の条件式を生成します。 field_id >= :field_id_from |
MatchType.RANGE_TO |
範囲終了の条件式を作成します。フィールドIDが"fieldIdTo"の場合以下の条件式を生成します。 field_id <= :field_id_to |
MatchType.IN |
INの条件式を生成します。MultiSelectFieldのフィールドに対して指定します。フィールドIDが"fieldId"の場合以下の条件式を生成します。 field_id IN (:field_id[0],:field_id[1], ... ,:field_id[n]) |