2015-04-22 55 views
0

我正在为我的大学写一个应用程序引擎应用程序。我现在想要实现的目标是创建一个方法,它接受一个课程名称,并返回所有课程年份的列表(认为它就像一个链接表,例如,如果数学是课程,并且它具有年份1,2年级和3年级; MathsYear1,MathsYear2和MathsYear3将是课程名称)。为什么这个方法停止正确返回?

这是该模块的代码(WARING:以下超肮脏的代码!):

@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; 
} 

它基本上需要一个课程名称,适用于所有课程的过滤器,以获得相应课程的对象,然后在课程上调用getAllCourseYearNames()以获取包含其所有课程年份名称的数组列表。 (我会喜欢用Keys做这个,但参数化的Objectify键似乎不支持这个版本的App Engine)。

然后,我尝试通过循环名称的数组列表并获取课程年份并为每个名称应用过滤器。我每次打印“测试”以查看循环的次数。就像我说的那样,这是一种超级肮脏的做法。

当我尝试将一些课程名称作为参数传递时,它只循环一次或两次的正确次数,之后根本不循环(不打印“test”)。我可以理解它是否永远循环,但不能正确地执行一次或两次,然后再也不会。它不能成功返回一个课程年份列表,但它确实有效,但相关数量的空值 - 我不知道这是否相关。我相信它每次成功地检索课程,因为我在加载后打印课程的名称,并且从来没有做到这一点。

如果任何人有任何建议,为什么这可能会发生,我会非常感激听到他们!

谢谢

+0

为什么使用低级API获取密钥,然后使用objectify来加载密钥?摆脱所有的低级代码,问题应该更加明显。 'ofy()。load()。type(Course.class).filter(“name”,name).first()。now()' – stickfigure

回答

2

查询2是从未在您的代码中使用。您可以重复使用以前的查询中的preparedQuery,该查询运行在不同的实体类型上。

+0

我们有一个哦,不!时刻,但可悲的是,没有解决它... – MiKenning

+0

你描述的两个问题中的哪一个不是固定的?另外,更新代码示例。 –