【问题标题】:jooq's contain clause with named paramsjooq 的包含命名参数的子句
【发布时间】:2017-05-16 15:33:05
【问题描述】:

我使用 jooq 作为 SQL 生成引擎,然后使用 jdbi 执行这些查询。 要将查询映射到它们的参数,我需要在 jdbi 中显式绑定它,但是当我将命名参数添加到包含子句时,参数名称会丢失。

这个测试用例展示了我对 getParams() 调用的期望

@Test
public void testJooqContains() {
    DSLContext context = new DefaultDSLContext(SQLDialect.MYSQL);
    Param<String> param = param("P1", "test");
    Condition condition = field("Field1").contains(param);
    SelectQuery<Record> select = context.selectQuery();
    select.addSelect(field("Col1"));
    select.addConditions(Collections.singletonList(condition));
    select.addFrom(table("Table1").as("T1"));

    assertTrue(select.getParams().containsKey("p1"));
}

【问题讨论】:

  • 这不能解决问题,但您的containsKey() 调用应该使用P1,而不是p1

标签: java jooq


【解决方案1】:

这是 jOOQ(#6223,针对 3.10、3.9.3、3.8.8 修复)中的一个错误,由 Java 语言规范 (see also this question) 中的一个微妙之处引起。

编译器将您的field("Field1").contains(param) 调用链接到Field.contains(T),而不是预期的Field.contains(Field&lt;T&gt;)。发生这种情况是因为您的 field("Field1") 表达式属于 Field&lt;Object&gt; 类型,这意味着这两种方法都适用。

解决这个问题的方法是这样写:

Condition condition = field("Field1", String.class).contains(param);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 2020-10-07
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多