Как создать оператор обновления с несколькими предложениями набора?

0

Я хочу создать инструкцию update с несколькими предложениями набора. Проблема в том, что некоторые из этих параметров могут быть нулевыми (не все из них). Мне нужно поставить запятую перед этими утверждениями, но я не знаю, как справиться с этим эффективно. Есть какой-либо способ сделать это?

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

Вот моя функция;

public static void update(value1, value2, value3){
    String sql = "UPDATE table SET ";

    //I need to check if these values are not null then I need to add them to sql string.

    sql += " WHERE condition";
}

Мое решение;

int count = 0;
if(value1 != null){
    if(count == 0) {
        sql += "column1 = value1";
    } else {
        sql += ", column1 = value1";
    }
    count++;
}

if(value2 != null){
    if(count == 0) {
        sql += "column2 = value2";
    } else {
        sql += ", column2 = value2";
    }
    count++;
}

if(value3 != null){
    if(count == 0) {
        sql += "column3 = value3";
    } else {
        sql += ", column3 = value3";
    }
    count++;
}
Теги:

2 ответа

1
Лучший ответ

Попробуйте использовать карту, где ключ будет именем столбца, а значение - значением столбца, примерно так:

public static String addSetValue(Map<String, Object> fieldMap) {
    StringBuilder  setQueryPart = new StringBuilder();
    for (Map.Entry<String, ? extends Object> entry: fieldMap.entrySet()) {
        if (entry.getValue() != null){
            setQueryPart.append(entry.getKey() + " = " +entry.getValue() + ", ");
        }
    }
    //Remove last comma, since we don't need it.
    setQueryPart.deleteCharAt(setQueryPart.lastIndexOf(","));
    return setQueryPart.toString();
}

Затем вы просто передаете карту, которую вы предварительно заполнили, и добавьте строку возврата в строку запроса.

1

Во-первых, создайте быстрый бит для хранения ключа и значения

class Token{
    private String key, value;

    public Token(String key, String value) {
        this.key = key;
        this.value = value;
    }
}

Затем используйте Stream для:

  • фильтровать нулевое значение
  • объединить ключ/значение (это можно сделать в методе Token
  • присоединяйте каждое значение с помощью запятой

Быстрый тест:

List<Token> list = new ArrayList<>();
list.add(new Token("A", "Foo"));
list.add(new Token("B", null));
list.add(new Token("C", "Bar"));

String query = 
    String.join(",", 
        list.stream()
           .filter(t -> t.value != null)
           .map(t -> t.key + "=" +t.value)
           .toArray(String[]::new)
    );
System.out.print(query);

А = Foo, С = бар


Другое решение для использования с PreparedStatement:

//remove every null values
list.removeIf(t -> t.value == null);

//Build the query with parameters ?
query = 
        String.join(",", 
            list.stream()
               .filter(t -> t.value != null)
               .map(t -> t.key + "=?")
               .toArray(String[]::new)
        );
System.out.println(query);

А = С =?,?

И список имеет соответствующие параметры.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню