Spring Data R2DB C параметры условного связывания для SQL запроса - PullRequest
1 голос
/ 28 марта 2020

Мне трудно связать условные параметры с запросом SQL с использованием Spring Data R2DB C DatabaseClient. Два параметра могут быть нулевыми. Поскольку DatabaseClient требует явно указать, что параметр имеет значение null, я попробовал следующий синтаксис, но условные параметры не были добавлены к существующим:

public Mono<Void> createAddress(Address address) {
    DatabaseClient.GenericExecuteSpec bindings = databaseClient.execute(addressesQueries.getProperty("addresses.insert"))
            .bind("line1", address.getLine1())
            .bind("zipCode", address.getZipCode())
            .bind("city", address.getCity())
            .bind("countryId", address.getCountry())
            .bind("id", address.getId()); // UUID

            if(address.getLine2() == null) {
                bindings.bindNull("line2", String.class);
            } else {
                bindings.bind("line2", address.getLine2());
            }
            if(address.getState() == null) {
                bindings.bindNull("state", String.class);
            } else {
                bindings.bind("state", address.getState());
            }

    return bindings.fetch().rowsUpdated().then();
}

SQL запрос:

INSERT INTO addresses(id,line1,line2,zip_code,city,state,country) VALUES(:id,:line1,:line2,:zipCode,:city,:state,:countryId)

Я знаю, что могу разбить запрос SQL для обработки случаев с / без нулевых параметров, но это будет немного сложнее, если у меня будет более одного условного параметра.

Знаете ли вы решение это может помочь мне сохранить один SQL запрос и обработать условные параметры в Java коде?

Заранее спасибо за вашу помощь.

1 Ответ

2 голосов
/ 28 марта 2020

Как уже отмечалось, объект bindings не изменяется с условными выражениями, поскольку вы вызываете методы bind и bindNull без сохранения таких измененных состояний обратно в объект. Поэтому параметры line2 и state никогда не заполняются значениями. Чтобы исправить это, рассмотрите возможность повторного назначения bindings для обновления объекта до его возврата:

if(address.getLine2() == null) { 
   bindings = bindings.bindNull("line2", String.class); 
} else { 
   bindings = bindings.bind("line2", address.getLine2()); 
} 

if(address.getState() == null) { 
   bindings = bindings.bindNull("state", String.class); 
} else { 
   bindings = bindings.bind("state", address.getState()); 
} 
...