AnyLogic
Развернуть
Размер шрифта

Примеры чтения данных из БД AnyLogic

Мы приведем несколько примеров запросов выборки значений 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);
Подробнее о функции executeExpression() и ее нотациях см. соответствующую статью.

Получение нескольких записей в виде отсортированного списка объектов Tuple

Предположим, нам нужно считать несколько записей из БД, отсортированных по записям в определенном столбце, и проанализировать их. Пусть мы работаем со следующей таблицей:

И нам нужно считать все курсы для определенного типа служащего и отсортировать их по столбцу 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 );
  …
}

Получение всех значений из заданного столбца в виде списка Java

Это очень легко: просто укажите имя столбца в вызове функции 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() возвращает булевский результат.

Как мы можем улучшить эту статью?