jooq包含带有命名params的子句

时间:2017-05-15 18:43:07

标签: java jooq

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

此测试用例显示了我对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"));
}

1 个答案:

答案 0 :(得分:1)

这是jOOQ中的一个错误(#6223,修正了3.10,3.9.3,3.8.8),这是由Java语言规范(see also this question)中的细微内容引起的。< / p>

您的field("Field1").contains(param)来电由编译器与Field.contains(T)而不是预期的Field.contains(Field<T>)相关联。发生这种情况是因为field("Field1")表达式的类型为Field<Object>,这意味着两种方法都适用。

此问题的解决方法是写:

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