使用子字符串过滤GAE键字段

时间:2015-07-04 09:56:59

标签: java google-app-engine objectify google-cloud-datastore

我有一个名为Posts的密钥,密钥是postId。

postId格式为:YYMMDDXXX。其中XXX是3位数序列号。

例如:150703001,150704001,150704002

如何从数据存储区中的实体获取序列号?我想将此SQL Select nvl(max(substring(postId, 7, 3)), 0) from posts where substring(postId, 1, 6) = '150704'转换为Objectivy过滤器。

请帮助,非常感谢!

1 个答案:

答案 0 :(得分:0)

您必须将您的种类/实体重新设计为不同的结构才能实现此目的。数据存储区无法按子字符串进行搜索。

可能的方法是这种布局:

@Entity
class PostGroup {

 @Id
 String id; // this is will hold the formatted date YYMMDD

}

@Entity 
class Post {

  @Id
  Long id; // auto generated ID

  @Index
  Long sequence; //  the sequence number

  @Parent
  Key<PostGroup> group;

}

现在,您可以为您的Objectify查询设置PostGroup包含祖先sort by Post.sequence desc limit 1以查找最新帖子。

String yymmdd = "150704";
Key<PostGroup> postGroupKey = Key.create(PostGroup.class, yymmdd);
Query<Post> query = ofy().type(Post.class).ancestor(postGroupKey).order("-sequence");
Post latestPost = query.first().now();

注意:您不必实际坚持PostGroup将其用作祖先。