postgresql SQL查询的Spring Data R2DBC参数条件绑定

m1m5dgzv  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(146)

我遇到了一个困难,将条件参数绑定到SQL查询使用Spring Data R2 DBC 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代码中的条件参数?

jjjwad0x

jjjwad0x1#

正如注解中所述,bindings 对象没有随条件而改变,因为您调用bindbindNull方法时没有将这些改变的状态保存回object。因此,line2state 参数永远不会填充值。要修复,请考虑重新分配 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()); 
}

字符串

jdgnovmf

jdgnovmf2#

您可以使用最新的库io.r2bc.spi Parameters类,并使用类似于
第一个月

相关问题