hibernate Criteria Query

很多時候我們會根據動態條件去查找數據,這個時候如果自己去動態構建HQL語句,語句就會比較複雜,這個時候Criteria Query可以幫助我們從面向對象的角度來構建SQL,下面舉例說明一下,按照動態條件的分頁查詢如何實現,對用戶進行動態條件查詢,查詢條件包含角色信息
UserQuery:

public class Query {
    private Integer startRow;

    private String sortBy;

    private String sortType;

    private Integer querySize;

    public Query(){

    }

    public Query(Query query){
        this.startRow = query.startRow;
        this.sortBy = query.sortBy;
        this.sortType = query.sortType;
        this.querySize= query.querySize;
    }

    public Integer getStartRow() {
        return startRow;
    }

    public void setStartRow(Integer startRow) {
        this.startRow = startRow;
    }

    public String getSortBy() {
        return sortBy;
    }

    public void setSortBy(String sortBy) {
        this.sortBy = sortBy;
    }

    public String getSortType() {
        return sortType;
    }

    public void setSortType(String sortType) {
        this.sortType = sortType;
    }

    /**
     * @return the querySize
     */
    public Integer getQuerySize() {
        return querySize;
    }

    /**
     * @param querySize
     *            the querySize to set
     */
    public void setQuerySize(Integer querySize) {
        this.querySize = querySize;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this.getClass())
                .add("startRow", startRow).add("querySize", querySize)
                .add("sortBy", sortBy).add("sortType", sortType)
                .toString();
    }
public class UserQuery extends Query {

    private String username;

    private String rolename;

    public UserQuery(){

    }

    public UserQuery(UserQuery query){
        super(query);
        this.username = query.username;
        this.rolename = query.rolename;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    /**
     * @return the rolename
     */
    public String getRolename() {
        return rolename;
    }

    /**
     * @param rolename the rolename to set
     */
    public void setRolename(String rolename) {
        this.rolename = rolename;
    }

    @Override
    public String toString() {
        return MoreObjects.toStringHelper(this.getClass())
                .add("startRow", getStartRow()).add("querySize", getQuerySize())
                .add("sortBy", getSortBy()).add("sortType", getSortType())
                .add("username", username).add("rolename", rolename)
                .toString();
    }
}

按照條件查詢用戶總數和按照條件查詢分頁用戶實現

public int getTotalCount(UserQuery query) {
        if(null == query){
            throw new IllegalArgumentException("query should not be null");
        }
        if(LOG.isDebugEnabled()){
            LOG.debug("create criteria with query: " + query);
        }
        Criteria c =  createCriteria(query);
        return ((Long)c.setProjection(Projections.rowCount()).uniqueResult()).intValue();
    }

    private Criteria createCriteria(UserQuery query) {
        if(LOG.isDebugEnabled()){
            LOG.debug("create criteria with query: " + query);
        }
        Criteria c = getSession().createCriteria(User.class);
        if(EnumUtils.isValidEnum(RoleNameEnum.class, query.getRolename())){
            c.createAlias("roles", "role");
            c.add(Restrictions.eq("role.name", query.getRolename()));
        }
        return c;
    } 

    /**
     * @param Query should not be null
     * @return Result list (UserInfo), list is empty if no result found
     */
    @SuppressWarnings("unchecked")
    public List<User> findUserByQuery(UserQuery query) {
        if(null == query){
            throw new IllegalArgumentException("query should not be null");
        }
        Criteria c = createCriteria(query);
        if (query.getStartRow() != null){
            c.setFirstResult(query.getStartRow());
        }
        if (query.getQuerySize() != null){
            c.setMaxResults(query.getQuerySize());
        }
        return c.list();
    }
發佈了110 篇原創文章 · 獲贊 14 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章