2015-04-22 2 views
0

Я пытаюсь написать приложение для приложения для своего университета. То, что я пытаюсь достичь прямо сейчас, заключается в том, чтобы создать метод, который принимает имя курса, и возвращает список всех курсов CourseYears (подумайте об этом как о таблице ссылок, например, если Maths является курсом, и он имеет год 1, год 2 и 3 год, MathsYear1, MathsYear2 и MathsYear3 будут именами CourseYears).Почему метод get перестает правильно возвращаться?

Это код модуля (Варинг: супер грязный код ниже!):

@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() на курсе, чтобы получить список массивов, содержащий все его имена CourseYears. (Я бы любил делать это с помощью Keys, но параметризованные ключи Objectify, похоже, не поддерживаются в этой версии App Engine).

Затем я попытаюсь получить CourseYears, перейдя через арраист имен и применив фильтр для каждого имени. Я каждый раз печатаю «тест», чтобы узнать, сколько раз он циклически зацикливается. Как я уже сказал, это супер грязный способ сделать это.

Когда я пытаюсь передать несколько названий курсов в качестве параметров, он повторяет правильное количество раз только один или два раза, а после этого вообще не зацикливается (не печатает «тест»). Я мог бы понять, если он никогда не зацикливается, но не делает это правильно один или два раза, а затем никогда больше. Он не успешно возвращает список CourseYears, когда он работает, а скорее соответствующее количество NULL - я не знаю, является ли это актуальным. Я считаю, что он успешно извлекает курс каждый раз, когда я печатаю имя курса после загрузки, и он никогда не перестает это делать.

Если у кого-то есть ЛЮБЫЕ предложения о том, почему это может произойти, я был бы невероятно благодарен за их слушание!

Thanks

+0

Почему вы используете API низкого уровня для получения ключа, а затем используете объектизацию для загрузки ключа? Избавьтесь от всего кода низкого уровня, и проблема должна быть более очевидной. 'ofy(). load(). type (Course.class) .filter (" name ", name) .first(). now()' – stickfigure

ответ

2

query2 никогда не используется в вашем коде. Вы повторно используете подготовленныйQuery из предыдущего запроса, который работает с другим видом объекта.

+0

У нас был Oh no! момент, но, к сожалению, это не исправить ... – MiKenning

+0

Какая из двух проблем, которые вы описали, не была исправлена? Также обновите пример кода. –

Смежные вопросы