上一版優化抽取了頁碼顯示邏輯,但 Action 仍需手拼 HQL:條件查詢時需大量 if (param != null) hql += " and ...",參數位置易錯、可讀性差、擴展性極低。本文引入 QueryHelper,實現「鏈式構建 HQL + 參數自動綁定」,讓 Action 徹底告別 SQL 碎片。
原頁面每個分頁鏈接需寫 JS 指定 xxx.action,現統一用 <form> 包裹查詢條件與分頁參數,提交即可:
<form id="pageForm" action="user_list.action" method="post">
<!-- 查詢條件 -->
<select name="deptId">...</select>
<input name="name" />
<input name="account" />
<!-- 分頁隱藏域 -->
<input type="hidden" name="page" />
<input type="hidden" name="rows" />
</form>
// 頁碼鏈接只需設置 page 值並提交 form
<a href="javascript:;" onclick="$('#pageForm').find('[name=page]').val(3); $('#pageForm').submit();">3</a>
public class QueryHelper {
private String fromClause; // 必填:from User u
private String whereClause = ""; // 選填:where u.dept.id = ? and u.name like ?
private String orderByClause = ""; // 選填:order by u.createTime desc
private List
public class UserAction extends BaseAction {
// 接收查詢條件(Struts2 自動注入)
private String name;
private String account;
private Long deptId;
// getter/setter 省略
public String list() {
QueryHelper qh = new QueryHelper("from User u")
.addWhereIf(deptId != null, "u.dept.id = ?", deptId)
.addWhereIf(StringUtils.isNotBlank(name), "u.name like ?", "%" + name + "%")
.addWhereIf(StringUtils.isNotBlank(account), "u.account like ?", "%" + account + "%")
.addOrderBy("u.createTime desc");
// 一行代碼完成分頁查詢並壓入值棧
pageBean = userService.getPageBean(page, rows, qh);
return "list";
}
}
連 service.getPageBean() 都可內移至 QueryHelper,Action 僅剩一行:
// QueryHelper 新增方法
public PageBean getPageBean(Service service, int page, int rows) {
PageBean pb = service.getPageBean(page, rows, this);
ActionContext.getContext().getValueStack().push(pb);
return pb;
}
// Action 終極形態
public String list() {
new QueryHelper("from User u")
.addWhereIf(deptId != null, "u.dept.id = ?", deptId)
.addWhereIf(StringUtils.isNotBlank(name), "u.name like ?", "%" + name + "%")
.addWhereIf(StringUtils.isNotBlank(account), "u.account like ?", "%" + account + "%")
.addOrderBy("u.createTime desc")
.getPageBean(userService, page, rows);
return "list";
}
| 階段 | 核心改進 | Action 代碼量 | 適用場景 |
|---|---|---|---|
| 初版 | PageBean 封裝分頁數據 | 手寫 HQL + 參數列表 | 單一無條件查詢 |
| 中版 | 抽取頁碼顯示標籤/JS | 手寫 HQL + 參數列表 | 固定條件查詢 |
| 終極版(本文) | QueryHelper 鏈式構建 + 條件式添加 + 內建 Service 調用 | 極簡聲明式,零 SQL 碎片 | 任意複雜條件/排序/多表關聯 |
至此,分頁查詢代碼結構清晰、擴展性強、極難出錯,新增列表頁面僅需關注「實體類、查詢條件、排序規則」三要素,真正實現「寫一次框架,處處復用」。