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