我使用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"));
}
答案 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);