JDBC の PreparedStatement で ? で置き換えられない箇所

– 次のようなコードで SQLException が出て, クエリのどこがおかしいのか数分悩んでしまった。

final int nLimit = 10;
final int nOffset = 20;
Connection con = getConnection();
try{
    PreparedStatement ps = con.prepareStatement(
            “select id from user limit ? offset ?”); // ここで例外
    try {
        ps.setInt(1, nLimit);
        ps.setInt(2, nOffset);
        // ….
    } finally { ps.close(); }
} finally { con.close(); }

パラメータマーカー “?” は limit, offset には使えないというのが答え(com.mysql.jdbc(mysql-connector-java) 3.1.6 で確認)。次のようにするしかないのかな…

“select id from user limit ” + nLimit + ” offset ” + nOffset

オフセットや表示数を外部から受け取る場合はもちろん int に変換してからにすること。