使用objectify对名称/值对象的list属性上的数据存储区实体进行排序

时间:2018-04-16 12:46:55

标签: java google-cloud-datastore objectify

使用Google Cloud Datastore,我想列出我的实体。 我想根据其名称检索按属性值排序的它们。

Java类模型:

public class ContainerEntity {
    @Index
    String id;
    @Index
    private List<NameValueProperty> properties;
}

public class NameValueProperty {
    @Index
    private String name;
    @Index
    private String value;
}

数据集示例:

"items": [
{
   "id": "114191058616700893306-20180416-120212-125-Qotx9AlsSRHg4cJhya",
   "properties": [
    {
     "name": "propertyIWantToOrderBy",
     "value": "BBBB"
    },
    {
     "name": "propertyIDoNotCareTheOrder",
     "value": "1522540800000"
    }
   ]
  },
  {
   "id": "114191058616700893306-20180416-120718-199-Qotx9AlsSRHg4cJhya",
   "properties": [
    {
     "name": "propertyIWantToOrderBy",
     "value": "AAAA"
    },
    {
     "name": "propertyIDoNotCareTheOrder",
     "value": "1522540800000"
    }
   ]
  }
}

如何使用客观化来做到这一点? 我尝试使用这段代码,但它不起作用:

Query<ContainerEntity> query = ObjectifyService.ofy().load().type(ContainerEntity.class);
query = query.filter("properties.name = ", "propertyIWantToOrderBy")
             .order("properties.value");

首先是过滤器(我不想要),然后看起来它没有在名称为&#34; propertyIWantToOrderBy&#34;的属性上正确排序。有没有解决方案/解决方法呢?想做类似订单的事情(&#34; properties.value,其中properties.name =&#39; propertyIWantToOrderBy&#39;&#34;)。 此设计的要点是拥有一个动态实体

Objectify版本:5.1.22 Jdk:8

1 个答案:

答案 0 :(得分:2)

当您尝试过滤和排序时,列表属性可能会造成混淆。请尝试这种方法:

public class ContainerEntity {
    @Id
    String id;
    @Index
    private Map<String, String> properties = new HashMap<>();
}

现在您的查询如下所示:

ofy().load().type(ContainerEntity.class).order("properties.propertyIWantToOrderBy");

顺便说一句,你不是@Index个ID,它们不是作为常规属性存储的。他们需要@Id注释。