HQL語句拼接模板

hQL語句拼接封裝類

package cn.jxlg.oa.util;

import java.util.ArrayList;
import java.util.List;

import cn.jxlg.oa.domain.PageBean;

import com.opensymphony.xwork2.ActionContext;

/**
 * 用於輔助拼接HQL語句
 *
 * @author tyg
 *
 */
public class QueryHelper {

    private String fromClause; // FROM子句
    private String whereClause = ""; // Where子句
    private String orderByClause = ""; // OrderBy子句

    private List<Object> parameters = new ArrayList<Object>(); // 參數列表

    /**
     * 生成From子句
     *
     * @param clazz
     * @param alias
     *            別名
     */
    public QueryHelper(Class clazz, String alias) {
        fromClause = "FROM " + clazz.getSimpleName() + " " + alias;
    }

    /**
     * 拼接Where子句
     *
     * @param condition
     * @param params
     */
    public QueryHelper addCondition(String condition, Object... params) {
        // 拼接
        if (whereClause.length() == 0) {
            whereClause = " WHERE " + condition;
        } else {
            whereClause += " AND " + condition;
        }

        // 參數
        if (params != null) {
            for (Object p : params) {
                parameters.add(p);
            }
        }

        return this;
    }

    /**
     * 如果第一個參數爲true,則拼接Where子句
     *
     * @param append
     * @param condition
     * @param params
     */
    public QueryHelper addCondition(boolean append, String condition, Object... params) {
        if (append) {
            addCondition(condition, params);
        }
        return this;
    }

    /**
     * 拼接OrderBy子句
     *
     * @param propertyName
     *            參與排序的屬性名
     * @param asc
     *            true表示升序,false表示降序
     */
    public QueryHelper addOrderProperty(String propertyName, boolean asc) {
        if (orderByClause.length() == 0) {
            orderByClause = " ORDER BY " + propertyName + (asc ? " ASC" : " DESC");
        } else {
            orderByClause += ", " + propertyName + (asc ? " ASC" : " DESC");
        }
        return this;
    }

    /**
     * 如果第一個參數爲true,則拼接OrderBy子句
     *
     * @param append
     * @param propertyName
     * @param asc
     */
    public QueryHelper addOrderProperty(boolean append, String propertyName, boolean asc) {
        if (append) {
            addOrderProperty(propertyName, asc);
        }
        return this;
    }

    /**
     * 獲取生成的用於查詢數據列表的HQL語句
     *
     * @return
     */
    public String getListQueryHql() {
        return fromClause + whereClause + orderByClause;
    }

    /**
     * 獲取生成的用於查詢總記錄數的HQL語句
     *
     * @return
     */
    public String getCountQueryHql() {
        return "SELECT COUNT(*) " + fromClause + whereClause;
    }

    /**
     * 獲取HQL中的參數值列表
     *
     * @return
     */
    public List<Object> getParameters() {
        return parameters;
    }

    /**
     * 查詢分頁信息,並放到值棧棧頂
     *
     * @param service
     * @param pageNum
     * @param pageSize
     */
    public void preparePageBean(DaoSupport<?> service, int pageNum, int pageSize) {
        PageBean pageBean = service.getPageBean(pageNum, pageSize, this);
        ActionContext.getContext().getValueStack().push(pageBean);
    }

}

使用案例

// 準備分頁信息 ,最終版
        new QueryHelper(Topic.class, "t")//
                // 過濾條件
                .addCondition("t.forum=?", forum)//
                .addCondition((viewType == 1), "t.type=?", Topic.TYPE_BEST) // 1 表示只看精華帖
                // 排序條件
                .addOrderProperty((orderBy == 1), "t.lastUpdateTime", asc) // 1 表示只按最後更新時間排序
                .addOrderProperty((orderBy == 2), "t.postTime", asc) // 2 表示只按主題發表時間排序
                .addOrderProperty((orderBy == 3), "t.replyCount", asc) // 3 表示只按回複數量排序
                .addOrderProperty((orderBy == 0), "(CASE t.type WHEN 2 THEN 2 ELSE 0 END)", false)//
                .addOrderProperty((orderBy == 0), "t.lastUpdateTime", false) // 0 表示默認排序(所有置頂帖在前面,並按最後更新時間降序排列)
                .preparePageBean(topicService, pageNum, pageSize);

發佈了34 篇原創文章 · 獲贊 6 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章