Google app engine 为什么这个get方法停止正确返回?

Google app engine 为什么这个get方法停止正确返回?,google-app-engine,objectify,Google App Engine,Objectify,我正在尝试为我的大学编写一个应用程序引擎应用程序。我现在试图实现的是创建一个方法,该方法接收课程名称,并返回所有CourseYears的列表(将其视为一个链接表,例如,如果数学是课程,它有1年、2年和3年;MathsYear1、MathsYear2和MathsYear3将是CourseYears的名称) 这是模块的代码(警告:下面是超级脏代码!): @ApiMethod(name=“courseYears”) 公共ArrayList courseYears(@Named(“name”)字符串名称

我正在尝试为我的大学编写一个应用程序引擎应用程序。我现在试图实现的是创建一个方法,该方法接收课程名称,并返回所有CourseYears的列表(将其视为一个链接表,例如,如果数学是课程,它有1年、2年和3年;MathsYear1、MathsYear2和MathsYear3将是CourseYears的名称)

这是模块的代码(警告:下面是超级脏代码!):

@ApiMethod(name=“courseYears”)
公共ArrayList courseYears(@Named(“name”)字符串名称){
DatastoreService datastore=DatastoreServiceFactory.getDatastoreService();
Query.Filter keyFilter=new Query.FilterPredicate(“name”,Query.FilterOperator.EQUAL,name);
查询查询=新查询(“课程”).setFilter(keyFilter);
PreparedQuery PreparedQuery=数据存储。准备(查询);
List resultList=preparedQuery.asList(FetchOptions.Builder.withLimit(1));
Course Course=ofy().load().type(Course.class).id(resultList.get(0.getKey().getId()).now();
ArrayList courseYearNames=course.getAllCourseYearNames();
System.out.println(course.getName());
ArrayList courseYears=新的ArrayList();
for(字符串courseYearName:courseYearNames){
Query.Filter courseNameFilter=新建Query.FilterPredicate(“名称”,Query.FilterOperator.EQUAL,courseYearName);
查询query2=新查询(“CourseYear”).setFilter(courseNameFilter);
List resL=preparedQuery.asList(FetchOptions.Builder.withLimit(1));
系统输出打印(“测试”);
CourseYear CourseYear=ofy().load().type(CourseYear.class).id(resL.get(0.getKey().getId()).now();
courseYears.add(courseYear);
}
返回航母;
}
它基本上接受一个课程名称,对所有课程应用过滤器以获取相应的课程对象,然后对课程调用getAllCourseYearNames()以获取包含其所有课程对象名称的数组列表。(我很想使用键来实现这一点,但这个版本的应用程序引擎似乎不支持参数化的Objectify键)

然后,我尝试通过遍历名称的arraylist并对每个名称应用过滤器来获取CourseYears。我每次打印“test”以查看循环次数。就像我说的,一种非常肮脏的方式

当我尝试将一些课程名称作为参数传递时,它只循环正确的次数一次或两次,然后就不再循环(不打印“test”)。我可以理解,如果它从来没有循环,但没有做正确的一次或两次,然后再也没有。当它工作时,它不会成功地返回CourseYears列表,而是相关的空值数量——我不知道这是否相关。我相信它每次都能成功地检索到课程,因为我在加载后打印了课程的名称,而且它从未失败过

如果有人对为什么会发生这种情况有任何建议,我将非常感谢听到他们


谢谢

您的代码中从不使用query2。您重新使用以前查询中的preparedQuery,该查询在不同的实体类型上运行。

我们有一个“哦,不!但遗憾的是,这并没有解决问题……您描述的两个问题中,哪一个没有解决?另外,更新代码示例。为什么要使用低级API获取密钥,然后使用objectify加载密钥?去掉所有的低级代码,问题就会更加明显<代码>of y().load().type(Course.class).filter(“name”,name).first().now()
    @ApiMethod(name = "courseYears") 
public ArrayList<CourseYear> courseYears(@Named("name") String name){
    DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();

    Query.Filter keyFilter = new Query.FilterPredicate("name", Query.FilterOperator.EQUAL, name);

    Query query = new Query("Course").setFilter(keyFilter);
    PreparedQuery preparedQuery = datastore.prepare(query);

    List<Entity> resultList = preparedQuery.asList(FetchOptions.Builder.withLimit(1));

    Course course = ofy().load().type(Course.class).id(resultList.get(0).getKey().getId()).now();

    ArrayList<String> courseYearNames = course.getAllCourseYearNames();

    System.out.println(course.getName());

    ArrayList<CourseYear> courseYears = new ArrayList<CourseYear>();

    for(String courseYearName: courseYearNames){
        Query.Filter courseNameFilter = new Query.FilterPredicate("name", Query.FilterOperator.EQUAL, courseYearName);
        Query query2 = new Query("CourseYear").setFilter(courseNameFilter);
        List<Entity> resL = preparedQuery.asList(FetchOptions.Builder.withLimit(1));

        System.out.println("test");

        CourseYear courseYear = ofy().load().type(CourseYear.class).id(resL.get(0).getKey().getId()).now();
        courseYears.add(courseYear);
    }

    return courseYears;
}