【问题标题】:Objectify - set filter if not nullObjectify - 如果不为空,则设置过滤器
【发布时间】:2017-02-13 12:23:52
【问题描述】:

我有一个包含一些可空查询参数的资源。 我想从数据库(GAE DataStore)返回相关实体 我有更短或更漂亮的方法吗(我正在寻找类似'set if not null'的方法)?

这是我的代码:

var query: Query<Kind> = ObjectifyService.ofy().load().type(Kind::class.java)

if (name != null) {
query = query.filter("name ==", name)
} else if (gender != null) {
query = query.filter("gender ==", gender)
} else if (address != null) {
query = query.filter("timing ==", address)
}

return query....
}

【问题讨论】:

    标签: google-app-engine objectify


    【解决方案1】:

    不幸的是,Objectify 中没有这样的东西。

    如果您要在过滤器中使用很多参数,一种流行的方法是builder 模式:

    public class QueryBuilder {
        public static final Class<Kind> TYPE = Kind.class;
        private Query<Kind> query;
    
        public QueryBuilder() {
            query = ofy().load().type(TYPE);
        }
    
        public QueryBuilder name(String name) {
            return setIfNotNull("name", name);
        }
    
        public QueryBuilder gender(String gender) {
            return setIfNotNull("gender", gender);
        }
    
        public QueryBuilder address(String address) {
            return setIfNotNull("address", address);
        }
    
        public Query<Kind> build() {
            return query;
        }
    
        private QueryBuilder setIfNotNull(String name, Object value) {
            if (value != null) {
                query = query.filter(name, value);
            }
            return this;
        }
    
    }
    

    然后:

    Query<Kind> query = new QueryBuilder()
            .name(name)
            .address(address)
            .gender(gender)
            .build();
    

    【讨论】:

    • 谢谢 经过调查,我喜欢在 kotlin 中扩展方法是正确的解决方案。
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多