Farz edelim ki elinizde select r.id, r.rolename from role_table r where r.rolename in (?)
şeklinde bir sorgu olsun.
Başka bir deyişle bir veya daha fazla sayıda rolename
değeri içeren bir liste ile role_table
’daki kayıtların bir
bölümünü sorgulamak istiyorsunuz. Eğer aşağıdaki gibi bir kod yazarsanız;
List listOfRoleNames = new ArrayList();
listOfRoleNames.add("role_user");
listOfRoleNames.add("role_editor");
jdbcTemplate.query("select r.id, r.rolename from role_table r where r.rolename in (?)",
new Object[]{listOfRoleNames}, new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Role(rs.getLong(1),rs.getString(2));
}
});
yazdığınız kod beklediğiniz sonucu vermeyecektir. Çünkü buradaki sorgunun where
condition’ında listOfRoleNames
’de kaç
tane eleman bulunuyorsa o kadar sayıda ?
koymanız gerekmektedir. JdbcTemplate
sorgudaki ?
işareti kadar verilen
Object
array üzerinde iterate edecek ve her bir ?
işareti için array’den bir eleman alacaktır. Eğer sorgularınızın
where
condition’ında dinamik olarak değişen sayıda input değişken kullanmak istiyorsanız bunun için NamedParameterJdbcTemplate
kullanmanız ve sorgunuzu da select r.id, r.rolename from role_table r where r.rolename in (:roleNames)
şeklinde yazmanız gerekir.
List listOfRoleNames = new ArrayList();
listOfRoleNames.add("role_user");
listOfRoleNames.add("role_editor");
namedParameterJdbcTemplate.query("select r.id, r.rolename from role_table r where r.rolename in (:roleNames)", new Object[]{listOfRoleNames},
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
return new Role(rs.getLong(1),rs.getString(2));
}
});
NamedParameterJdbcTemplate
asıl işi yine kendi içindeki sıradan JdbcTemplate
nesnesine delege etmektedir. Bu arada
roleNames
listesindeki elemanların sayısının, veritabanları değişken sayıdaki input parametreler için “hard limit”
koyduklarından, bu değeri aşmadığından emin olmalısınız.