引入命名参数会破坏jOOQ查询

用户13818874:

要查询PostgreSQL 10.11数据库,我使用的是jOOQ 3.12.4,它与Spring Boot 2.2捆绑在一起。

假设我已经使用jOOQ建立了这样的查询:

final String[] ids = ...;

final var query = dslContext.selectFrom(MY_TABLE).where(MY_TABLE.ID.in(ids));
final Map<String, List<MyTable>> changeDomains = query.fetch().intoGroups(MY_TABLE.ID, MyTable.class);

这段代码可以正常运行并产生预期的结果。但是,当我重构查询并引入一个命名参数(以便在代码的多个部分重用查询)时,如下所示:

final String[] ids = ...;

final var query = dslContext.selectFrom(MY_TABLE).where(MY_TABLE.ID.in(param("ids")));
final Map<String, List<MyTable>> changeDomains = query.bind("ids", ids).fetch().intoGroups(MY_TABLE.ID, MyTable.class);

我突然开始出现以下错误:

org.springframework.jdbc.BadSqlGrammarException: jOOQ; bad SQL grammar ...; nested exception is org.postgresql.util.PSQLException: ERROR: operator does not exist: text = character varying[]
    Hinweis: No operator matches the given name and argument type(s). You might need to add explicit type casts.

编辑:我使用时遇到相同的错误

MY_TABLE.ID.in(param("ids", String[].class))

代替。

我该如何解决或解决此问题?

卢克·埃德(Luke Eder):

一种更好的代码重用方法解决方案

但是当我重构查询并引入一个命名参数(以便在代码的多个部分重用查询)时

虽然您可以通过这种方式使用jOOQ(请注意,以非线程安全的方式更改和重用jOOQ查询时要小心!),但通常建议您以更实用的方式使用jOOQ,请参见:

重复使用jOOQ查询不会带来太多收益,特别是几乎没有任何性能提升。

因此,代替此:

final var query = dslContext.selectFrom(MY_TABLE)
    .where(MY_TABLE.ID.in(param("ids")));
final Map<String, List<MyTable>> changeDomains = query
    .bind("ids", ids).fetch().intoGroups(MY_TABLE.ID, MyTable.class);

这样写:

public ResultQuery<MyTableRecord> query(String[] ids) {
    return dslContext.selectFrom(MY_TABLE).where(MY_TABLE.ID.in(ids));
}

// And then:
final Map<String, List<MyTable>> changeDomains = query(ids)
    .fetch().intoGroups(MY_TABLE.ID, MyTable.class);

您遇到的实际问题:

jOOQ,JDBC和SQL不支持单个绑定值IN列表。虽然写这个似乎很有用:

SELECT * FROM t WHERE c IN (:bind_value)

并将数组或列表作为单个绑定值传递,SQL不支持此功能。某些API可能假装支持此功能(但在幕后将单个绑定值替换为多个?, ?, ..., ?

PostgreSQL支持= ANY (:bind_value)数组运算符

SELECT * FROM t WHERE c = ANY (:bind_value)

您可以使用在jOOQ中使用它

dslContext.selectFrom(MY_TABLE).where(MY_TABLE.ID.eq(any(ids)));

这样,您可以bind()在执行之前调用该方法来替换数组。但是,我仍然建议您编写动态返回查询的函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有命名参数的本机查询失败,并显示“未设置所有命名参数”

Hibernate命名查询按参数排序

休眠查询:定位参数和命名参数

C ++ 14中引入的哪些更改可能会破坏用C ++ 11编写的程序?

在Spring Repository中命名查询参数

检查休眠命名查询中是否存在特定的命名参数

输入参数命名查询

添加基于注释的帮助会破坏动态参数的获取帮助

Scala案例类命名参数是否会降低性能?

为什么在bash脚本中添加睡眠似乎会破坏某些命名变量的变量递减?

引入关键字“ singleton_class”会破坏Ruby代码或引起其他困难吗?

为什么引入日期参数会弄乱我的查询?在MySQL中加入3个表

为什么MySQL逸出会破坏整个查询?

Django | 更改pk view参数会破坏视图

为什么Doctrine QueryBuilder会破坏我的查询?

更改PHP“必需”参数会破坏站点结构

命名存储过程查询Collection参数?

以UUID为参数的Hibernate命名查询

向路由模型添加参数会破坏ArrayController

python sqlite查询中的命名参数

为sequelize findAll添加限制会破坏查询吗?

命名为默认的ES6参数,无破坏

向参数添加空格时查询字符串被破坏

添加与属性的关系会破坏其他查询

Bash 脚本中的位置参数会破坏其他命令

添加额外的字段会破坏我的查询

删除在 BigQuery 上创建预定查询的用户会破坏该查询吗?

即使设置了参数,URL 查询参数也会返回 null

将函数放入命名空间会破坏 std::vector 的使用