Лучший способ создать SQL-запрос «String» с несколькими значениями параметров во время выполнения?

Мне нужно создать 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'

любые предложения или любой другой способ добиться этого?

определить «лучший способ»? (проще читать, быстрее, безопасность, ...) - также полезно знать типы задействованных переменных - в любом случае вообще не нужно использовать StringBuilder, просто обычная конкатенация с использованием +

user85421 21.04.2024 09:30

Давайте продолжим обсуждение в чате.

user641887 21.04.2024 09:33

Я уже упоминал, что мне дополнительно нужно передать его как тело запроса в REST API.

user641887 21.04.2024 09:34

если вопрос в том, «как преобразовать список строк в строку, разделенную запятыми», я бы предложил String.join(",", params.getDepartmentIdList) или аналогичный

user85421 21.04.2024 09:40

Я был настолько погружен в проблему, что не задавал себе правильный вопрос. на самом деле, add(String.join("','",params.getDepartmentIdList) сделал свое дело. Если вы хотите опубликовать это как ответ, я приму.

user641887 21.04.2024 09:47

Почему вы помещаете SQL в тело HTTP-запроса? Почему API, похоже, раскрывает подробности о своем механизме хранения?

ndc85430 21.04.2024 20:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто для удобства чтения я бы разделил запрос и заранее подготовил данные.

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)")' и тому подобное.

Frank Hopkins 21.04.2024 13:00

«читабельность», вероятно, основана на мнениях... и следует также учитывать удобство обслуживания. IMO, использование форматтера в этом случае не делает его лучше, чем обычная конкатенация, также константы лучше включать напрямую. Но последовательность тоже важна: в отношении регистра букв, например and и DEPARTMENTID, по сравнению с остальными; разделение строк/один атрибут на строку,...

user85421 21.04.2024 13:20

Да, это основано на мнении. Просто предложение. На мой взгляд, гораздо легче понять, для чего предназначен запрос, если он написан в простой форме, а не следовать всем функциям append. Что касается именования, я использовал запрос автора как есть. Конечно, лучше иметь некоторую последовательность.

RanAbitbul 21.04.2024 13:24

Другие вопросы по теме