Spring SQL 查询的数据 R2DBC 参数条件绑定
Spring Data R2DBC parameters conditional binding for SQL query
我在使用 Spring Data R2DBC DatabaseClient 将条件参数绑定到 SQL 查询时遇到困难。两个参数可以为空。由于 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 查询来处理 with/without 空参数的情况,但是如果我有一个以上的条件参数,它会有点复杂。
您是否知道可以帮助我在 Java 代码中保留一个 SQL 查询和处理条件参数的解决方案?
如评论所述,bindings 对象不会随着条件而改变,因为您调用了 bind
和 bindNull
方法而没有将这些改变的状态保存回对象。因此 line2 和 state 参数永远不会填充值。要解决此问题,请考虑重新分配 bindings 以在其 return:
之前更新对象
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());
}
我在使用 Spring Data R2DBC DatabaseClient 将条件参数绑定到 SQL 查询时遇到困难。两个参数可以为空。由于 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 查询来处理 with/without 空参数的情况,但是如果我有一个以上的条件参数,它会有点复杂。
您是否知道可以帮助我在 Java 代码中保留一个 SQL 查询和处理条件参数的解决方案?
如评论所述,bindings 对象不会随着条件而改变,因为您调用了 bind
和 bindNull
方法而没有将这些改变的状态保存回对象。因此 line2 和 state 参数永远不会填充值。要解决此问题,请考虑重新分配 bindings 以在其 return:
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());
}