Objectify 过滤器不起作用,除了按 id 获取
Objectify filter does not work except for fetch by id
最初我的任务是按日期过滤记录,我为其编写了以下查询但没有返回任何结果,即使我在数据存储中有 4 条记录满足条件
ObjectifyService.run(() -> ObjectifyService.ofy().cache(false).load().type(SomeClass.class).filter("createdDate <", date.toString())
.list());
注意 - 我有 createdDate 的索引。
后来为了看是否真的在取东西,写了fetch all records which returns no results
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注解有关。是这样吗?
您的问题就在这里:
filter("createdDate <", date.toString())
您正在按字符串值过滤日期字段。日期字段必须按日期值过滤。删除 toString()
,您应该会看到预期的行为。
数据存储的无模式特性意味着您在比较不同类型的值时不会遇到类型检查错误。事实上,您可以将一些字段保存为 String 的实体和一些字段保存为 Date 的实体(尽管这通常是个坏主意)。数据存储有绝对顺序;所有字符串(无论其内容如何)都大于所有日期,因此您的过滤器 returns 什么都没有。
最初我的任务是按日期过滤记录,我为其编写了以下查询但没有返回任何结果,即使我在数据存储中有 4 条记录满足条件
ObjectifyService.run(() -> ObjectifyService.ofy().cache(false).load().type(SomeClass.class).filter("createdDate <", date.toString())
.list());
注意 - 我有 createdDate 的索引。
后来为了看是否真的在取东西,写了fetch all records which returns no results
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注解有关。是这样吗?
您的问题就在这里:
filter("createdDate <", date.toString())
您正在按字符串值过滤日期字段。日期字段必须按日期值过滤。删除 toString()
,您应该会看到预期的行为。
数据存储的无模式特性意味着您在比较不同类型的值时不会遇到类型检查错误。事实上,您可以将一些字段保存为 String 的实体和一些字段保存为 Date 的实体(尽管这通常是个坏主意)。数据存储有绝对顺序;所有字符串(无论其内容如何)都大于所有日期,因此您的过滤器 returns 什么都没有。