Skip to content

orm需要增加一个EmptyQuery #247

@qjekingstar

Description

@qjekingstar

增加一个EmptyQuery类实现LimitQuery,减少特殊场景下无意义的数据库查询,例如:
假设场景是根据给定的资源列表取用户权限,复写了Action的getQueryBuilder

if(resources.isEmpty()){
    query.where("1=2");
} else {
    query.where("permission.resource in(:resources) and permission.user=:user",resources,user);
}

这时候会发现因为entityDao.search在Action的search方法中,如果在getQueryBuilder方法中实现的话会触发sql查询,而实际上是没有意义的,如果只是search在用getQueryBuilder方法还好,但是如果复用率高的话,就变成每个方法都要在search之前判断一次,建议框架层面直接处理掉
我目前的实现方案:
给AbstractQueryBuilder增加一个属性emptyQuery
在build方法中判断emptyQuery构建EmptyQuery实例
改动HibernateEntityDao:

public <T> List<T> search(org.beangle.commons.dao.query.Query<T> query) {
    if (query instanceof LimitQuery) {
        org.beangle.commons.dao.query.LimitQuery<T> limitQuery = (org.beangle.commons.dao.query.LimitQuery<T>) query;
        if (null == limitQuery.getLimit()) {
            if (query instanceof EmptyQuery) {
                return new ArrayList<T>();
            } else {
                return QuerySupport.find(limitQuery, getSession());
            }
        } else {
            if (query instanceof EmptyQuery) {
                return new SinglePage<T>(limitQuery.getLimit().getPageNo(), limitQuery.getLimit().getPageSize(),
                    QuerySupport.count(limitQuery, getSession()), new ArrayList<T>());
            } else {
                return new SinglePage<T>(limitQuery.getLimit().getPageNo(), limitQuery.getLimit().getPageSize(),
                    QuerySupport.count(limitQuery, getSession()), QuerySupport.find(query, getSession()));
            }
        }
    } else {
        return QuerySupport.find(query, getSession());
    }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions