除按ID提取外,Objectify过滤器不起作用

时间:2019-06-30 09:41:44

标签: google-cloud-datastore objectify

最初,我的任务是按日期过滤记录,即使我在数据存储中有4条符合条件的记录,我编写的以下查询也没有返回结果

    ObjectifyService.run(() -> ObjectifyService.ofy().cache(false).load().type(SomeClass.class).filter("createdDate <", date.toString())
                .list());

注意-我有createdDate的索引。

后来,我只是想检查它是否真的在获取东西,我编写了获取所有记录但未返回结果的记录

    ObjectifyService.run(() -> ObjectifyService.ofy().cache(false).load().type(SomeClass.class).list());

我有一种方法可以查询id,现在只能查询。

    ObjectifyService.run(() -> ObjectifyService.ofy().cache(false).load().type(SomeClass.class).id("someId").now());

无法弄清楚这里出了什么问题。

下面是实体本身

    @Entity(name = "SomeClass")
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Subclass
    public class SomeClass implements Serializable {

        @Id
        private String id;
        private int importId;
        private String name;
        private String value;
        private Date lastModified;
        @Index
        private Date createdDate;
        private List<SomeOtherClass> someOtherClass;

    }

我觉得这与@subclass注释有关。是吗?

1 个答案:

答案 0 :(得分:1)

您的问题就在这里

toString()

您正在按字符串值过滤日期字段。日期字段必须按日期值过滤。放下V1 = V2, V2 = V3, ..., Vn-1 = Vn, Vn = value. ,您应该会看到预期的行为。

数据存储的无模式性质意味着您在比较不同类型的值时不会出现类型检查错误。实际上,您可以将带有字段的某些实体保存为String,将带有字段的某些实体保存为Date(通常是个好主意)。数据存储区具有绝对顺序;所有字符串(无论其内容如何)都大于所有日期,因此您的过滤器不返回任何内容。