Создание запросов выборки

В AnyLogic, вы обычно создаете запросы на выборку, используя удобный графический конструктов запросов.

Однако вы можете создавать и специализированные запросы, используя один из двух альтернативных синтаксисов: Java SQL, или Query DSL.

Java SQL

Вы можете написать запрос, используя обычный SQL. Чтобы выполнить SQL утверждение, используйте функцию AnyLogic selectUniqueValue() или selectFirstValue(). Обе функции содержат два аргумента: возвращаемое значение и текстовый SQL запрос (типа String). 

selectUniqueValue() возвращает единственное значение, а если будет несколько значений, удовлетворяющих выбранному условию, вы увидите сообщение об ошибке.

selectFirstValue() не выдаст ошибку в случае нескольких допустимых значений, просто вернет первое значение из результата запроса.

Пример:

selectUniqueValue(double.class, "SELECT processing_time FROM processing_times WHERE part = agent.name;");

Как мы видим, используется обычный SQL запрос. Однако, обращаем ваше внимание, разбив запрос на несколько строк (как показано ниже) вы получите ошибку.

selectUniqueValue(double.class, "SELECT processing_time 
FROM processing_times WHERE part = agent.name;");

Чтобы продолжить писать запрос с новой строки, следует закончить текущую строку пробелом, поставить кавычки ", затем поставить символ сложения +, и после этого начать новую строку символом ". То есть, допустимый многострочный запрос в AnyLogic должен выглядеть следующим образом: 

selectUniqueValue(double.class, "SELECT processing_time " +
"FROM processing_times WHERE part = agent.name;");

QueryDSL. Каскадный стиль синтаксиса

В Query DSL, вызовите функцию selectFrom() и используйте каскадные функции интерфейса SQLQuery: where, groupBy, having, orderBy, join, и т.д.

Пример: 

(double)selectFrom( courses ).
      where( courses.course.eq( courseName ) ).
      uniqueResult( courses.duration_days )

Если нужен дополнительный оператор в запрос на выборку, необходимо поставить точку и поместить вызов соответствующей каскадной функции наподобие нашей, где where() определяет предмет выборки, а uniqueResult() позволяет возвращать единственный результат, а не несколько допустимых.

Чтобы писать запросы в Query DSL, ознакомьтесь со статьей с примерами использования оператора SELECT.

Также есть отдельные статьи о следующих SQL операторах и их аналогах в Query DSL: ORDER BY, GROUP BY, WHERE, INSERT, UPDATE, DELETE.

Ниже краткое описание каскадных функций:

innerJoin, join, leftJoin, fullJoin, on : Используйте эти операторы, чтобы определить элементы объединения. Для функции JOIN первый аргумент является источником сложения, а второй целью (псевдонимом).

where : Определяет фильтры запроса либо в функции с переменным количеством аргументов (varargs) с разделением запятыми, либо каскадно через оператор and.

groupBy : Определяет аргументы оператора группировки group by в функции с переменным количеством аргументов.

having : HAVING аналогичен WHERE за исключением того, что строки отбираются не по значениям столбцов, а строятся из значений столбцов, указанных в GROUP BY, и значений агрегатных функций, вычисленных для каждой группы, образованной GROUP BY.

orderBy : Используйте orderBy для сортировки данных, возвращаемых запросом.

limit, offset, restrict : Определяет вывод результата. Выражение LIMIT может использоваться для ограничения количества строк, возвращенных командой SELECT. Оператор Offset позволяет пропустить указанное количество строк перед тем как выводить результаты запроса.

list : Определяет перечень значений для столбцов таблицы, которые указаны как аргументы функции.

all : Выводит значения всех столбцов опрашиваемой таблицы БД

uniqueResult : Возвращает единственный результат.

firstResult : Возвращает первый результат по определенному запросу на выборку, или null если ничего не найдено