【问题标题】:Spring Data R2DBC parameters conditional binding for SQL query用于 SQL 查询的 Spring Data R2DBC 参数条件绑定
【发布时间】:2020-03-28 15:09:09
【问题描述】:

我在使用 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 查询来处理带/不带空参数的情况,但如果我有多个条件参数,它会有点复杂。

您知道可以帮助我保留一个 SQL 查询并在 Java 代码中处理条件参数的解决方案吗?

【问题讨论】:

  • 您检查对象(address.getLine2()、address.getState())是否等于null?也许它们是空的?
  • 即使line2 和state 值不为空也不为空,我也收到此错误:org.springframework.dao.InvalidDataAccessApiUsageException: No parameter specified for [line2] in query
  • 我可能错了,但请尝试在 if/else 中重新分配 bindings 对象条件:bindings = bindings.bindNull(...);
  • 按预期工作,重新分配绑定对象。谢谢@Parfait。

标签: sql postgresql spring-webflux reactor-netty spring-data-r2dbc


【解决方案1】:

正如所评论的,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()); 
} 

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 2023-03-15
    • 2020-07-04
    • 2021-12-14
    • 2020-06-14
    • 1970-01-01
    • 2021-05-17
    • 2017-10-22
    • 2018-08-20
    相关资源
    最近更新 更多