Мы приведем несколько примеров запросов выборки значений SELECT. Все эти примеры взяты из примера Corporate Education.
Демо-модель: Corporate Education Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.Предположим, вам нужно считать из этой таблицы конкретную продолжительность курса:
И использовать эту длительность в качестве таймаута перехода диаграммы состояний. Код будет таким:
String courseName = "Product Line";
double timeout = (double)selectFrom(courses).
where(courses.course.eq(courseName)).
uniqueResult( courses.duration_days);
При использовании функции uniqueResult() и явном преобразовании в double следует помнить, что возвращаемый результат является int и не преобразуется автоматически в double. Именно поэтому приходится приводить его вручную.
Кроме того, могут возникнуть ситуации, когда необходимо вычислить возвращаемое значение, чтобы получить значение фактического типа, который необходимо использовать в модели. В этом случае используйте функцию executeExpression() и передайте значение из базы данных в качестве параметра этой функции.
Например, если в приведенной выше таблице в столбце taking_place_now содержится булево значение, необходимо вручную обработать это значение, чтобы получить его не в виде строки, а в виде действительного булева значения:
String courseName = "Product Line";
String durationString = selectFrom(courses).
where( courses.course.eq(courseName)).
uniqueResult(courses.taking_place_now);
boolean duration = executeExpression(durationString);
Предположим, нам нужно считать несколько записей из БД, отсортированных по записям в определенном столбце, и проанализировать их. Пусть мы работаем со следующей таблицей:
И нам нужно считать все курсы для определенного типа служащего и отсортировать их по столбцу not_earlier_than_w_day. В этом случае код будет выглядеть так:
List<Tuple> plan =
selectFrom( education_plans ).
where( education_plans.employee_type.eq( type ) ).
orderBy( education_plans.not_earlier_than_w_day.asc() ).
list();
Обратите внимание, что вызов функции orderBy() предшествует финальному вызову функции list(). Работа с результатами ведется достаточно простым образом, просто итерируйтесь в цикле, и осуществляйте доступ к определенному столбцу с помощью функции get():
for( Tuple tup : plan ) {
…
tup.get( education_plans.course );
tup.get( education_plans.not_earlier_than_w_day );
tup.get( education_plans.not_later_than_w_day );
…
}
Это очень легко: просто укажите имя столбца в вызове функции list():
List<String> courseslist = selectFrom( courses ).list( courses.course );
Таблица в данном случае следующая:
И конечно вы можете задать условие, добавив в середину функцию where(), как в следующем примере, где нам нужно получить все курсы обучения, которые могут быть проведены тренером данного типа:
List<String> complist = selectFrom( trainer_competences ).
where( trainer_competences.trainer_type.eq( type ) ).
list( trainer_competences.course );
Приведенный выше код работает со следующей таблицей:
Предположим, у вас есть коллекция employeeTypes, и вы хотите добавить в нее все значения из столбца type таблицы БД employee_types. Это выполнит следующий код:
employeeTypes.addAll(
selectFrom( employee_types ).
list( employee_types.type ));
И опять же, вы можете добавить любые дополнительные условия с помощью функции where().
Пусть вам нужно проверить, может ли тренер определенного типа провести данный курс обучения. Компетенции тренеров заданы в следующей таблице:
Запрос будет выглядеть так:
selectFrom( trainer_competences ).
where( trainer_competences.trainer_type.eq( type ),
trainer_competences.course.eq( course ) ).
exists();
Обратите внимание на два условия, заданных в функции where() как два параметра, перечисленные через запятую – они интерпретируются как два условия, объединенные оператором AND (И), и завершающий вызов функции exists() возвращает булевский результат.
-
Как мы можем улучшить эту статью?
-