junior
Что такое JQL (Jira Query Language)?
JQL (Jira Query Language) — структурированный язык запросов для поиска задач в Jira, используемый в UI (фильтры, дашборды), REST API (эндпоинт /search), плагинах и автоматизации.
Аналогия из жизни: JQL — это как поисковая строка Google, но для задач Jira. Вместо свободного текста вы пишете структурированные условия: какой проект, какой статус, кто исполнитель — и получаете точный результат.
Базовый синтаксис
Пример
field operator value [AND|OR] field operator value ORDER BY field [ASC|DESC]
Операторы
| Оператор | Описание | Пример |
|---|---|---|
= |
Равно | project = "PROJ" |
!= |
Не равно | status != Done |
>, <, >=, <= |
Сравнение | created >= -7d |
~ |
Содержит (текстовый поиск) | summary ~ "критическая ошибка" |
!~ |
Не содержит | description !~ "test" |
IN |
Одно из значений | status IN (Open, "In Progress") |
NOT IN |
Не одно из значений | priority NOT IN (Low, Lowest) |
IS EMPTY |
Пусто | assignee IS EMPTY |
IS NOT EMPTY |
Не пусто | fixVersion IS NOT EMPTY |
WAS |
Было (история) | status WAS "In Progress" |
CHANGED |
Изменилось | assignee CHANGED |
Встроенные функции
Пример
-- Текущий пользователь
assignee = currentUser()
-- Дата: начало/конец дня, недели, месяца
created >= startOfDay()
created >= startOfWeek(-1)
duedate <= endOfMonth()
-- Члены группы
assignee IN membersOf("developers")
-- Связанные задачи
issue IN linkedIssues("PROJ-123")
-- Подзадачи
issue IN subtasksOf("PROJ-100")
-- Задачи из эпика
"Epic Link" = "PROJ-50"
-- Текстовый поиск по всем полям
text ~ "deploy*"
Custom Fields в JQL
Пример
-- По имени (с кавычками)
"Story Points" > 5
-- По ID (надёжнее)
cf[10100] > 5
Сложные запросы
Пример
project = PROJ
AND status IN ("In Progress", "Code Review")
AND assignee IN membersOf("backend-team")
AND created >= startOfWeek()
AND priority IN (Critical, Blocker)
AND "Story Points" <= 8
ORDER BY priority DESC, created ASC
Использование JQL в Java
Пример через REST API и в плагине Jira DC
// Через REST API
public List<Issue> findCriticalBugs(String projectKey) {
String jql = "project = %s AND type = Bug AND priority = Critical AND status != Done"
.formatted(projectKey);
String body = """
{
"jql": "%s",
"maxResults": 50,
"fields": ["summary", "status", "assignee", "priority"]
}
""".formatted(jql);
return restClient.post()
.uri("/search")
.body(body)
.retrieve()
.body(SearchResult.class)
.getIssues();
}
// В плагине Jira DC через SearchService
@Named
public class IssueSearchHelper {
private final SearchService searchService;
private final JqlQueryParser jqlQueryParser;
@Inject
public IssueSearchHelper(@ComponentImport SearchService searchService,
@ComponentImport JqlQueryParser jqlQueryParser) {
this.searchService = searchService;
this.jqlQueryParser = jqlQueryParser;
}
public SearchResults search(ApplicationUser user, String jqlString)
throws SearchException, ParseException {
Query query = jqlQueryParser.parseQuery(jqlString);
return searchService.search(user, query, PagerFilter.getUnlimitedFilter());
}
}
Производительность JQL
- Индексируемые поля (status, project, priority) работают быстро
- Текстовый поиск (
~) использует Lucene, может быть медленным на больших инстансах WASиCHANGEDоператоры сканируют историю — дорогие операции- Сложные
ORс подзапросами замедляют выполнение - Для DC: кастомные поля без индексации значительно замедляют поиск
Частые ошибки
- Использование
=вместо~для текстового поиска:summary = "error"ищет точное совпадение - Забыть кавычки для значений с пробелами:
status = In Progress— ошибка, нужно"In Progress" - Неэффективные запросы с
WAS/CHANGEDна инстансах с большой историей - Использование
ORDER BYс неиндексированными кастомными полями
Как используется в 2026
- JQL остаётся основным языком запросов в Jira DC и Cloud
- В Cloud добавлены новые функции:
issuesWithRemoteLinksByGlobalId(), улучшенный полнотекстовый поиск - Atlassian экспериментирует с AI-ассистентом для генерации JQL из естественного языка
- JQL используется в Jira Automation rules для определения scope правил
На собеседовании: знание JQL ожидается от любого Jira-разработчика. Покажите владение основными операторами, функциями (
currentUser(),membersOf(),startOfWeek()) и умение составлять сложные запросы. Отметьте, чтоcf[id]надёжнее имени поля и что~поддерживает Lucene-синтаксис.