如何在祖先查询上应用日期过滤器

时间:2016-06-16 07:19:31

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

我有两个实体模型学生和出勤,每个出勤实体都有相关的学生家长。

出勤模式:

print_r($_POST);

学生模特:

@Entity
public class Attendance {

 @Id
 Long id;
 @Index
 Date date;
 @Parent
 @Index
 @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
 Ref<Student> studentRef;

 public Long getId() {
 return id;
 }

 public Date getDate() {
 return date;
 }

 public void setDate(Date date) {
 this.date = date;
 }
 public String getWebsafeKey() {
 return Key.create(studentRef.getKey(), Attendance.class, id).getString();
 }
}

这是我如何将出勤实体插入数据存储区:

@Entity
public class Student {

 @Id
 Long id;
 @Index
 String name;

 String student_id;

 Long mobile_number;
 String email;

 @Index
 @ApiResourceProperty(ignored = AnnotationBoolean.TRUE)
 List<Ref<Shift>> shiftRef = new ArrayList<Ref<Shift>>();

 public Long getId() {
 return id;
 }

 public String getStudent_id() {
 return student_id;
 }

 public void setStudent_id(String student_id) {
 this.student_id = student_id;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public Long getMobile_number() {
 return mobile_number;
 }

 public void setMobile_number(Long mobile_number) {
 this.mobile_number = mobile_number;
 }

 public String getEmail() {
 return email;
 }

 public void setEmail(String email) {
 this.email = email;
 }

 public String getWebsafeKey() {
 return Key.create(Student.class, id).getString();
 }
}

问题:

  1. 上述查询以数据格式存储数据存储中的日期: 2016-06-15(18:01:18.845)IST
    但是当我在没有指定父母的情况下检索同一个实体时,它会给我一个日期:&#34; date&#34;:&#34; 2016-06-15T12:31:18.845Z&#34; 。请解释一下吗?

  2. 我能够存储与每个学生相对应的出勤率,并且能够检索学生的所有出勤率。 但如何在指定的日期或日期范围内检索学生的出勤率? 我试过打击查询: 查询query = ofy()。load()。type(Attendance.class).ancestor(studentKey).filter(&#34; date =&#34;,date);

  3. 但它给了我以下例外:

    Key<Student> studentKey = Key.create(student_web_safe_key);
    Date date = new Date();
    date.setTime(System.currentTimeMillis());
    attendance.setDate(date);
    attendance.studentRef = Ref.create(studentKey);
    ofy().save().entity(attendance).now();
    

2 个答案:

答案 0 :(得分:1)

回答问题1:

Appengine使用UTC时间戳。因此,您的时间戳将从您的时区转换为UTC。但它仍然是相同的日期和时间。在输出期间,您需要考虑时间戳可能包含时区并相应地格式化/计算本地时间。

回答问题2:

您拥有错误所需的所有信息。如果你添加

<datastore-index kind="Attendance" ancestor="true" source="manual">
    <property name="date" direction="asc"/>
</datastore-index>

到您的datastore-indexes.xml您的查询应该有效。 如果该文件尚不存在,请在{em> web.xml 和 appengine-web.xml 文件旁边的src/main/webapp/WEB-INF/datastore-indexes.xml下创建该文件。 您可以找到example on this page

至于原因:此错误的答案始终是:因为数据存储区需要此查询的复合索引。

答案 1 :(得分:1)

只是想根据评论添加到konqi的答案:

如果您在Android Studio中使用Cloud Endpoints,则必须先在导航面板中切换到“项目”视图,然后导航到“后端”文件夹,然后导航到src-&gt; main-&gt; webapp-&gt; WEB-INF然后在该文件夹中,您必须手动创建datastore-indexes.xml文件。这是你的看法:

<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes autoGenerate="true">
    <!-- NOTE: Not necessary to create composite indexes here for single property indices b.c. they are build in.-->

    <!-- If you do not specify direction, default is: direction="asc" -->

    <datastore-index kind="Attendance" ancestor="true" source="manual">
        <property name="date" direction="asc"/>
    </datastore-index>

</datastore-indexes>