我想使用 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"
}
]
}
}
如何使用 objectify 来做到这一点? 我尝试使用这段代码,但它不起作用:
Query<ContainerEntity> query = ObjectifyService.ofy().load().type(ContainerEntity.class);
query = query.filter("properties.name = ", "propertyIWantToOrderBy")
.order("properties.value");
首先它进行过滤(我不想要),然后看起来名称为“propertyIWantToOrderBy”的属性的顺序不正确。有什么解决方案/解决方法可以做到这一点吗?想做一些类似 order("properties.value whereproperty.name='propertyIWantToOrderBy'") 的事情。 这个设计的要点是拥有一个动态实体。
对象化版本:5.1.22 JDK:8
最佳答案
当您尝试对列表属性进行过滤和排序时,它们可能会令人困惑。尝试这种方法:
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
注释。
关于java - 使用 objectify 对名称/值对象的列表属性上的数据存储实体进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49857743/