そのようにSpring Jdbc Templateを使用します:
public List<User> getUsersForGrid(int rows, int page, String sidx,
String sord) {
int fromRecord = 0;
int toRecord = 0;
toRecord = page * rows;
fromRecord = (page - 1) * rows;
StringBuilder sqlB = new StringBuilder();
sqlB.append("SELECT user_id, username ");
sqlB.append("FROM users ");
sqlB.append("WHERE :fromRecord <= rownum AND rownum <= :toRecord ");
sqlB.append("ORDER BY %s %s ");
String sql = String.format(sqlB.toString(), sidx, sord);
MapSqlParameterSource params = new MapSqlParameterSource();
params.addValue("fromRecord", fromRecord);
params.addValue("toRecord", toRecord);
List<Map<String, Object>> rsRows = this.jdbcTemplate.queryForList(sql
.toString(),params);
List<User> users = new ArrayList<User>();
for (Map<String, Object> row : rsRows) {
BigDecimal id = (BigDecimal) row.get("user_id");
String username = (String) row.get("username");
User user = new User(id.intValue(), username);
users.add(user);
}
return users;
}
そして得る java.sql.SQLException: Invalid column type
sidx は列 nate("user_id" など) です sord は asc/desc です
パラメータを渡さない場合(実行のみ)
sql.append("SELECT user_id, username ");
sql.append("FROM users ");
) 全て大丈夫。
更新: で動作します:
sqlB.append("WHERE ? <= rownum AND rownum <= ? ");
と
this.jdbcTemplate.queryForList(sql.toString(),new Object[]{fromRecord, toRecord});
Spring MapSqlParameterSource と名前付きパラメーターに問題があるようです。私はSpring 3.1.3を使用しています
DBはOracle 11.2です
describe users;
Name Null Type
------------------------------ -------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
USER_ID NOT NULL NUMBER
USERNAME NOT NULL VARCHAR2(40)
PASSWORD NOT NULL VARCHAR2(20)
ENABLED NOT NULL NUMBER