使用Objectify链接过滤器不起作用

时间:2014-12-14 00:26:07

标签: google-app-engine objectify

出于某种原因,我需要将我的数据存储在Map中,并且我不想逐个声明我的客观化实体的每个属性。

例如,这是我的地图的样子:

"COMPANY_NAME" -> "something"
"TURNOVER_Min" -> 1000000 (a long value)
"CLIENT_STATUS"-> true (a boolean value)

我想执行这样的查询:

List<Lead> leads = ofy().load().type(Lead.class).filter("data.NET_INCOME_MIN >", 5.0).filter("data.NET_INCOME_MAX <", 100.0).list();

但是我没有得到任何结果,尽管有些数据符合此查询......

我必须告诉你,它适用于一个大型的过滤器...... 它也适用于带有“=”的几个过滤器:

这是我的实体:

import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Index;

@Entity
public class Lead implements Serializable {

    private static final long serialVersionUID = 5920146927107230150L;

    @Id
    private String url;

    @Index
    private Date dateCreated;

    @Index
    private Map<String, Object> data = new HashMap<>();

    public Lead() {}

    public Lead(String url) {
        this.url = url;
        this.dateCreated = new Date();
    }

    public void addData(String key, Object value) {
        data.put(key, value);
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public Date getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(Date dateCreated) {
        this.dateCreated = dateCreated;
    }

    public Map<String, Object> getData() {
        return data;
    }

    public void setData(Map<String, Object> data) {
        this.data = data;
    }   
}

非常感谢

1 个答案:

答案 0 :(得分:2)

这不是你的错,也不是Objectify问题。

根据数据存储documentation

  

不等式过滤器最多只能限制一个属性

做你想做的事:

  1. 使用第一个过滤器仅检索实体的键(使用.keys()而不是.list())。
  2. 使用第二个过滤器仅检索实体的键。
  3. 要执行ANDing,您需要获取上面检索到的两个密钥集的交集。
  4. 现在您拥有所需实体的密钥,您可以通过批量获取操作获取实体。