api.db Использование запросов к базе данных
api.db.query. HQL запросы
Результат исполнения методов api.db.query зависит от конкретной базы данных, например, может изменяться сортировка получения результатов, если правило сортировки не было явно указано в запросе.
Использование api.db.query увеличивает скорость получения данных, но такие скрипты требуют тщательного анализа и контроля при обновлении отдельных составляющих системы и версии приложения в целом.
Не рекомендуется при вызове прямых запросов к базе данных использовать команды INSERT INTO, UPDATE и DELETE. Все изменения данных в системе следует проводить только через системное API (методы utils.create, utils.edit и utils.delete). В частности, работа с объектами через этот метод не учитывает права на работу с объектами.
Запросы к базе данных со сложной логикой фильтрации (язык запросов ):
-
Получение списка объектов.
HQL запрос:
def query = api.db.query('from T');
def objectList = query.list();
-
Получение всех объектов типа INC класса "Запрос" (serviceCall):
HQL запрос:
return api.db.query("SELECT count(sc.id) FROM serviceCall sc WHERE case_id ='INC'").list();
Поле case_id используется при построении HQL запросов для получения объектов определенного типа в рамках одного класса объектов. При выполнении запросов с case_id, которые обращаются к объектам двух и более классов, возникает ошибка.
-
Установка максимального количества возвращаемых объектов в запросе:
HQL запрос:
def query = api.db.query('from T');
query.setMaxResults(10);
def objectList = query.list();
Если указать максимальное количество возвращаемых объектов <= 0, то ограничения снимутся и вернутся все записи.
-
Установка значения параметра в запросе:
HQL запрос:
def query = api.db.query('from T where id = :id'); query.set('id', 1234); def objectList = query.list();
-
Установка значения параметра-коллекции в запросе:
HQL запрос:
def query = api.db.query('from T where type in :types'); def types = ['my-type', 'my-type-2', 'my-type-3']; query.set('types', types); def objectList = query.list();
-
Установка параметров в запросе с использованием набора элементов ключ-значение:
HQL запрос:
def query = api.db.query('from T where type = :type and enabled = :enabled'); def params = [type: 'my-type', enabled: true]; query.set(params); def objectList = query.list();
-
Поиск элементов справочника по названию:
HQL запрос:
def QUERY = api.db.query(""" SELECT p.color FROM impact as p WHERE p.title.ru = 'Высокая'"""); return QUERY.list().get(0);
-
Получение внутренних свойств атрибута типа "Временной интервал" dtInterval. Можно получить количество миллисекунд (ms) и строковое представление единицы измерения периода (interval).
HQL запрос:
def ms = api.db.query('select resolutionTime.ms from serviceCall').list()[0] def interval = api.db.query('select resolutionTime.interval from serviceCall').list()[0] assert ms instanceof Long assert interval instanceof String assert interval in ['DAY', 'SECOND', 'WEEK', 'MINUTE', 'HOUR']
Если в настройках атрибута типа "Временной интервал" включено свойство "Запоминать выбранные единицы измерения", то получение interval недоступно.
Параметры атрибута типа "Временной интервал" можно получить скриптовыми методами через обращение к переменным контекста. Не рекомендуется обращаться к параметрам атрибута через HQL-запрос к базе данных, так как структура базы данных может меняться
-
Поиск объектов по атрибуту типа "Ссылка на бизнес объект" (использование в WHERE):
При использовании параметра запроса для указания значения атрибута типа "Ссылка на бизнес объект" внутри блока WHERE и передаче объекта в качестве его значения, необходимо указывать .id у атрибута внутри HQL-запроса. Если не указать, будет ошибка, что атрибут не найден: classCode$typeCode:$type$.
def query = api.db.query('from classCode$typeCode where sboAttr.id = :boValue') query.set('boValue', utils.load('classCode$1234')) return query.list()
-
api.db.isReadOnly()
Идентификации инстанса SMP, на котором выполняется текущий скрипт. Метод позволяет определить в скрипте работает ли нода с RO репликой или нет, на какой ноде (front, back, report) выполняется скрипт.
Возвращает:
- true — если скрипт выполняется на инстансе SMP (отчетной ноде), который работает с read-only репликой базы данных;
- false — скрипт выполняется на back или universal нодах.