使用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
答案 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
注释。