【问题标题】:Google app engine, objectify how to order by a sub entity field?谷歌应用引擎,物化如何按子实体字段排序?
【发布时间】:2017-04-28 10:43:45
【问题描述】:

我有一个包含以下字段的课程实体

@Index
private @Load
Ref<Student> student;

然后学生实体拥有该字段

 @Index
private String matric;

我想加载所有使用学生矩阵编号排序的课程实体。

我尝试过使用“。”运算符来获取这样的子字段

ofy().load().type(Course.class).filter("course", course).order("student.matric").list();

但这不会返回任何结果。

可以这样做吗?如何?

【问题讨论】:

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


    【解决方案1】:

    我认为使用 objectify 是不可能的。我会让 Course 实现 Comparable:

    @Entity
    public class Course implements Comparable<Course> {
        .
        .
        .
        @Override
        public int compareTo(Course otherCourse) {
            return this.getStudent().getMatric().compareTo(otherCourse.getStudent().getMatric());
        }
    }
    

    删除 Objectify 加载的“顺序”部分并改用 Collections.sort():

    List<Course> courses = ofy().load().type(Course.class).filter("course", course).list();
    Collections.sort(courses);
    

    【讨论】:

    • 对于第一篇文章中的错误,我们深表歉意。现在更正了:)
    • 谢谢,我对得到结果后的排序并不感兴趣。我感兴趣的是对数据存储中的数据进行排序,因为我并没有将它单独用于这个实现。我最需要的是结果被分页的地方,如果我得到一个未排序的结果然后使用任何字段对其进行排序,结果会让用户感到困惑。
    【解决方案2】:

    数据存储中没有连接。如果您想按学生属性查询课程,您可能需要将数据非规范化到课程中并对其进行索引。这意味着更改学生数据也需要更改课程。

    顺便说一句:这个数据模型很奇怪。你确定你所说的课程不是真正的注册吗?

    【讨论】:

    • 是的,它是一个注册。为简单起见,我在 stackoverflow 上将其称为课程,注册包含课程作为其中的一个字段。谢谢。
    猜你喜欢
    • 2023-03-13
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多