我需要使用一些查询参数进行过滤查询。我需要如果查询参数为空,则不计算查询条件(例如,= 或 LIKE),并返回所有内容。我正在使用R2DBC,但我找不到解决方法。
zwghvu4y1#
如果 您 使用 的 是 Spring Data R2dbc , 除了 上面 的 原始 SQL 查询 , 您 还 可以 使用 R2dbcOperations 按 条件 自由 组合 Criteria 。下面 是 一 个 示例 。
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 值 的 工作 。
R2dbcRepository
like
""
a0x5cqrl2#
一个一般性的准备好的陈述可能是:
SELECT * FROM yourTable WHERE col = ? or ? IS NULL;
如果将NULL值绑定到模糊层中的?,则WHERE子句将始终为true,并返回表中的所有记录。
NULL
?
WHERE
wlzqhblo3#
如果 您 更 喜欢 使用 " 静态 SQL 语句 " ( 意味 着 您 对 所有 可能 的 绑定 值 使用 单个 SQL 字符 串 ) 来 执行 此 操作 , 那么 在 Oracle 中 , 它 可能 是 optimal to use NVL() to profit from an Oracle optimiser feature, as explained in this article , 而 不管 您 是否 使用 R2DBC :
NVL()
SELECT * FROM t WHERE col = nvl(:bind, col)
中 的 每 一 个但是 , 像 您 这样 的 查询 通常 最 好 使用 dynamic SQL, such as supported by a third party library like jOOQ 来 实现 :
Flux<TRecord> result = Flux.from(ctx .selectFrom(T) .where(bind == null ? noCondition() : T.COL.eq(bind)) );
格式很 明显 , 您 也 可以 直接 使用 R2DBC 和 您 自己 的 动态 SQL 库 或 任何 其他 此类 库 来 自己 完成 此 操作 。免责 声明 : 我 为 jOOQ 背后 的 公司 工作 。
3条答案
按热度按时间zwghvu4y1#
如果 您 使用 的 是 Spring Data R2dbc , 除了 上面 的 原始 SQL 查询 , 您 还 可以 使用
R2dbcOperations
按 条件 自由 组合Criteria
。下面 是 一 个 示例 。
中 的 每 一 个
此外 , 使用
R2dbcRepository
和 基于 约定 的 方法 , 尝试 在like
中 使用 默认 值 ( 例如 , 在like
中 将 null 设置 为 空 字符 串""
) , 以 节省 确定 SQL 中 是否 为 null 值 的 工作 。a0x5cqrl2#
一个一般性的准备好的陈述可能是:
如果将
NULL
值绑定到模糊层中的?
,则WHERE
子句将始终为true,并返回表中的所有记录。wlzqhblo3#
如果 您 更 喜欢 使用 " 静态 SQL 语句 " ( 意味 着 您 对 所有 可能 的 绑定 值 使用 单个 SQL 字符 串 ) 来 执行 此 操作 , 那么 在 Oracle 中 , 它 可能 是 optimal to use
NVL()
to profit from an Oracle optimiser feature, as explained in this article , 而 不管 您 是否 使用 R2DBC :中 的 每 一 个
但是 , 像 您 这样 的 查询 通常 最 好 使用 dynamic SQL, such as supported by a third party library like jOOQ 来 实现 :
格式
很 明显 , 您 也 可以 直接 使用 R2DBC 和 您 自己 的 动态 SQL 库 或 任何 其他 此类 库 来 自己 完成 此 操作 。
免责 声明 : 我 为 jOOQ 背后 的 公司 工作 。