DatabaseFilter 是一種用於封裝動態 SQL 查詢條件 (WHERE) 與排序 (ORDER BY) 的工具類,常見於 JSF/ADF 或自製資料存取層。本文記錄如何建立控制項、構建 FilterTerm 與 SortTerm,並透過頁面流 (JPF) 實現多條件查詢與結果顯示。
以註解方式定義 SQL,參數為 DatabaseFilter:
/** @jc:sql command-type="grid"
* rowset-name="B_CANTONRowSet"
* max-rows="1000"
* statement="SELECT CANTON_ID, PLACENAME, ZIP... FROM HAPPYTREE.HT_B_CANTON {sql: filter.getWhereClause()} {sql: filter.getOrderByClause()}"
*/
public RowSet getAllBCanton(DatabaseFilter filter) throws SQLException;
簡單表單提交至 action="select"。
Grid 組件綁定查詢回傳的 RowSet。
/** @jpf:action @jpf:forward name="success" path="grid.jsp" */
protected Forward select(DatabaseForm form) {
SortFilterService sortFilterService = SortFilterService.getInstance(getRequest());
DatabaseFilter filter = new DatabaseFilter();
List<DatabaseFilter.FilterTerm> list = new ArrayList<>();
// 條件 1: canton_id 大於輸入值
DatabaseFilter.FilterTerm query = new DatabaseFilter.FilterTerm();
query.sColumnName = "canton_id";
query.op = DatabaseFilter.opGreater;
query.value = form.getCanton_id();
list.add(query);
// 可繼續添加多條件...
// DatabaseFilter.FilterTerm query2 = ...; list.add(query2);
// 轉陣列
DatabaseFilter.FilterTerm[] terms = list.toArray(new DatabaseFilter.FilterTerm[0]);
// 排序設定
DatabaseFilter.SortTerm[] sterms = new DatabaseFilter.SortTerm[1];
sterms[0] = new DatabaseFilter.SortTerm();
sterms[0].sColumnName = "placename";
sterms[0].op = DatabaseFilter.opDesc;
filter = new DatabaseFilter(terms, sterms);
try {
allRows = myControl.getAllBCanton(filter);
} catch (Exception e) { e.printStackTrace(); }
return new Forward("success", new DatabaseForm());
}
DatabaseFilter.FilterTerm:單一查詢條件 (欄位、運算子、值)DatabaseFilter.SortTerm:單一排序規則 (欄位、升/降序)DatabaseFilter:封裝條件陣列與排序陣列,自動生成 WHERE/ORDER BY 子句| 常數 | 含義 |
|---|---|
opEqual | = |
opNotEqual | != |
opGreater | > |
opLess | < |
opLike | LIKE |
opIsNull | IS NULL |
opIsNotNull | IS NOT NULL |
| 優點 | 注意 |
|---|---|
| 條件與排序物件化,避免 SQL 字串拼接風險 | 屬於特定框架 (如 BEA WebLogic Workshop/JPF) 專用 API,非標準 JDBC |
| 支援多條件組合、動態排序 | 需確認底層 SQL 生成邏輯防止注入,雖然通常已處理參數化 |
| 與頁面流、表單 Bean 整合良好 | 遷移至其他框架需重寫查詢條件構建邏輯 |
QueryBuilder 介面,支援多種 Filter 實作filter.where("id").gt(100).and("name").like("A%")