我正在试图弄清楚如何将JOOQ与NamedParameterJdbcTemplate一起使用。我已经成功创建了其他查询,但我坚持创建一个包含WHERE子句的查询。当我尝试运行下面的方法时,我收到错误 org.springframework.dao.InvalidDataAccessApiUsageException:SQL [select“first_name”from“customer”,其中“id”= cast(?as integer)]:给出1个参数但预计为0
当我尝试仅使用equals()中的整数时,我得到相同的错误,例如...... .where(fieldByName(“id”)。equal(1001),相同的错误和.where(fieldByName(“id”) ).equal(id),同样的错误。
如果我删除WHERE子句,查询本身似乎工作正常。
我在这里做错了什么?在我看来,SQL语法是正确的。这可能是我的愚蠢,但我真的找不到这里的错。请帮忙!
public String getCustomerFirstName(int id) {
Query query = create.select(fieldByName("first_name"))
.from(tableByName("customer"))
.where(fieldByName("id").equal(param("id", id)));
Param param = query.getParam("id");
SqlParameterSource namedParameters = new MapSqlParameterSource(param.getName(), id);
return this.getNamedParameterJdbcTemplate().queryForObject(query.getSQL(), namedParameters, String.class);
}
答案 0 :(得分:2)
为了让jOOQ生成命名参数,您必须明确告诉它这样做。
在你的情况下,这将使
String sql = create.renderNamedParams(query);
上述内容将取代您对
的号召query.getSQL();
请注意,此处记录在案:
http://www.jooq.org/doc/3.0/manual/sql-building/bind-values/named-parameters
未来版本的jOOQ(可能是3.1)可能会支持使用设置来初始化DSLContext
,以便始终呈现命名参数。这已在路线图中注册为功能请求: