3

NamedParameterJdbcTemplate で JOOQ を使用する方法を理解しようとしています。他のクエリは正常に作成できましたが、WHERE 句を含むクエリの作成に行き詰まっています。以下のメソッドを実行しようとすると、エラーorg.springframework.dao.InvalidDataAccessApiUsageException: SQL [select "first_name" from "customer" where "id" = cast(? as integer)]: given 1 parameters but expected 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);
}
4

1 に答える 1

3

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、名前付きパラメーターを常にそのようにレンダリングする設定での初期化がおそらくサポートされるでしょう。これは、ロードマップに機能リクエストとして登録されています。

https://github.com/jOOQ/jOOQ/issues/2414

于 2013-04-26T22:57:30.267 に答える