2015-04-22 58 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

你描述的兩個問題中的哪一個不是固定的?另外,更新代碼示例。 –