Мне нужно создать SQL-запрос, который мне нужно будет передать в качестве тела запроса в REST API. Я изо всех сил пытаюсь найти лучший способ создать этот sql в виде строки
То, что у меня есть до сих пор, это через StringBuilder
stringBuilder.append("SELECT * FROM employee "
+ "WHERE employeeId = 'A' and employeeName IN "
+ "('ABC', 'PQR', 'ZYZ')"
+ " and active = 'ACTIVE' and DEPARTMENTID in ('")
.append(params.getDepartmentIdList)
.append("'")
.append(" and deactivate = false")
.append(" and triggerId = '")
.append(params.gettriggerId())
.append("'");
return stringBuilder.toString();
Вывод, который я получаю, очень похож на то, что я ищу, за исключением DepartmentId, DepartmentIdList заполняется как
('[ABC, BWP, DAS, DAD]' instead of 'ABC', 'BWP', 'DAS', 'DAD'
Обратите внимание: [] в значениях DEPARTMENTID.
SELECT * FROM employee WHERE employeeId = 'A' and employeeName IN ('ABC', 'PQR', 'ZYZ') and active = 'ACTIVE' and DEPARTMENTID in ('[ABC, BWP, DAS, DAD]' and deactivate = false and triggerId = '123456'
любые предложения или любой другой способ добиться этого?
Давайте продолжим обсуждение в чате.
Я уже упоминал, что мне дополнительно нужно передать его как тело запроса в REST API.
если вопрос в том, «как преобразовать список строк в строку, разделенную запятыми», я бы предложил String.join(",", params.getDepartmentIdList)
или аналогичный
Я был настолько погружен в проблему, что не задавал себе правильный вопрос. на самом деле, add(String.join("','",params.getDepartmentIdList) сделал свое дело. Если вы хотите опубликовать это как ответ, я приму.
Почему вы помещаете SQL в тело HTTP-запроса? Почему API, похоже, раскрывает подробности о своем механизме хранения?
Просто для удобства чтения я бы разделил запрос и заранее подготовил данные.
private final static QUERY = """
SELECT * FROM employee
WHERE employeeId = %s
AND employeeName IN '%s'
AND active = %s
AND DEPARTMENTID in '%s'
AND deactivate = %s
AND triggerId = %s
""";
var active = "ACTIVE";
var deactivate = "false";
var employeeNames = String.join(",", List.of('ABC', 'PQR', 'ZYZ'));
var departmentIds = String.join(",", params.getDepartmentIdList());
var triggerId = params.getTriggerId();
var queryBody = String.format(QUERY, employeeId,
employeeNames,
active,
depeartmentIds,
deactivate,
triggerId);
Два совета: вы также можете использовать «.formated([arguments])», примененный к запросу. И хотя мне обычно нравятся встроенные параметры форматирования, чем больше аргументов вы хотите заменить, тем сложнее сопоставить аргумент с тем, куда он идет, поэтому я предпочитаю вручную создавать что-то вроде «SELECT ... WHERE active =$ACTIVITYLEVEL$ и DEPATMENTID in ' %DEPIDS%'", а затем перейдите к 'query.replace("%ACTIVITYLEVEL%, "ACTIVE").replace("%DEPIDS%", "(4,5)")' и тому подобное.
«читабельность», вероятно, основана на мнениях... и следует также учитывать удобство обслуживания. IMO, использование форматтера в этом случае не делает его лучше, чем обычная конкатенация, также константы лучше включать напрямую. Но последовательность тоже важна: в отношении регистра букв, например and
и DEPARTMENTID
, по сравнению с остальными; разделение строк/один атрибут на строку,...
Да, это основано на мнении. Просто предложение. На мой взгляд, гораздо легче понять, для чего предназначен запрос, если он написан в простой форме, а не следовать всем функциям append
. Что касается именования, я использовал запрос автора как есть. Конечно, лучше иметь некоторую последовательность.
определить «лучший способ»? (проще читать, быстрее, безопасность, ...) - также полезно знать типы задействованных переменных - в любом случае вообще не нужно использовать
StringBuilder
, просто обычная конкатенация с использованием+