2015-07-04 30 views
2

我有一种名为Posts的关键字是postId。用子字符串过滤GAE关键字段

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

您能否以更多以用户为中心的术语解释您正在尝试做什么?在合成密钥合适的情况下,这是一个很少选择的自然密钥。如果您想按日期订购帖子,请添加索引日期字段。 – stickfigure

+0

@stickfigure嗨,我想要做的只是做一个主键。你有任何其他方式来制作自动生成的主键吗? –

+1

只需将'@Id Long id'留空即可。它将在分配的唯一ID后保存。更聪明的是使用'ObjectifyFactory.allocateId()'方法预先为施工分配ID,这样你就永远不会有没有ID的对象。这就是所谓的“手册开始”所说的全部内容;如果您至少浏览Objectify和GAE的文档,您将浪费更少的时间。 – stickfigure

回答

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; 

} 

现在,您可以设置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 s到使用它们作为祖先。

+0

嗨@koma,谢谢你的回答。你能给我举例来获取最新邮报的代码吗?对不起,我是这里的新手。 –

+1

@MayaNastasya更新了答案 – koma

+1

这实际上不起作用。 'id'不是一个索引字段;它是关键的一部分,因此不能'订购'(你可以在'__key__'上订购,但是具有不同的行为)。此外,自动生成的ID不会单调递增(它们是分散的),因此即使您可以按字段进行过滤/排序,您也不会得到预期的订单。 – stickfigure