我需要用一些查询参数进行筛选查询。我需要,如果查询参数为null,则不计算查询的条件(例如,=或LIKE(,并返回所有内容。我正在使用R2DBC,但我找不到解决它的方法。
如果您使用的是Spring Data R2dbc,除了上面的原始SQL查询之外,您还可以使用R2dbcOperations
根据条件自由组合Criteria
。
以下是一个示例。
template
.select(Post.class)
.matching(
Query
.query(where("title").like("%" + name + "%"))// extract where here you can assemble the query condition freely.
.limit(10)
.offset(0)
)
.all();
此外,使用R2dbcRepository
和基于约定的方法,尝试在like
中使用默认值(例如,在like
中将null设置为空字符串""
(来保存确定它是否是sql中的null值的工作。
一个通用的准备好的语句可能是:
SELECT *
FROM yourTable
WHERE col = ? or ? IS NULL;
如果从模糊层将NULL
值绑定到?
,则WHERE
子句将始终为true,返回表中的所有记录。
如果您更喜欢使用";静态SQL语句";(意味着您对所有可能的绑定值使用一个SQL字符串(,然后,在Oracle中,使用NVL()
从Oracle优化器功能中获利可能是最佳的,如本文所述,无论您是否使用R2DBC:
SELECT *
FROM t
WHERE col = nvl(:bind, col)
然而,像您这样的查询通常最好使用动态SQL来实现,例如由第三方库(如jOOQ:(支持
Flux<TRecord> result =
Flux.from(ctx
.selectFrom(T)
.where(bind == null ? noCondition() : T.COL.eq(bind))
);
很明显,您也可以自己直接使用R2DBC和您自己的动态SQL库或任何其他类似的库来实现这一点。
免责声明:我为jOOQ背后的公司工作。