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

  • api.db.isReadOnly()

    Идентификации инстанса SMP, на котором выполняется текущий скрипт. Метод позволяет определить в скрипте работает ли нода с RO репликой или нет, на какой ноде (front, back, report) выполняется скрипт.

    Возвращает:

    • true — если скрипт выполняется на инстансе SMP (отчетной ноде), который работает с read-only репликой базы данных;
    • false — скрипт выполняется на back или universal нодах.