使用R2DBC筛选查询



我需要用一些查询参数进行筛选查询。我需要,如果查询参数为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背后的公司工作。

最新更新