私はこのようなことをすることができますか?
select * from mytable m where m.group_id in (?)
...そして、引数のリストまたは配列を渡して、パラメータに展開します。つまり、次のようになります。
select * from mytable m where m.group_id in (1,2,3,4)
具体的には、SpringクラスとJdbcTemplate/SimpleJdbcTemplateクラスを使用しています。
私はこのようなことをすることができますか?
select * from mytable m where m.group_id in (?)
...そして、引数のリストまたは配列を渡して、パラメータに展開します。つまり、次のようになります。
select * from mytable m where m.group_id in (1,2,3,4)
具体的には、SpringクラスとJdbcTemplate/SimpleJdbcTemplateクラスを使用しています。
NamedParameterJdbcTemplateを使用してそれを行うことができます。
サンプルを使用すると、次のようになります。
NamedParameterJdbcTemplate db = ...;
List paramList = ...;
Map idsMap = Collections.singletonMap("ids", paramList);
db.query("select * from mytable m where m.group_id in (:ids)", idsMap);
申し訳ありませんが、それはできません。それを行うための便利なメソッドを自分で作成することはできますが、setParameterList()
私の知る限り、Hibernate のようなものはありません。
以下のコードを見つけてください
public Collection<Employee> findByIds(List<String> ids) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("ids", ids);
List<Employee> employees = namedParameterJdbcTemplate.query(
"SELECT * FROM trn_employee where employee_id IN (:ids)",
params,
ParameterizedBeanPropertyRowMapper.newInstance(Employee.class));
return employees;
}
はい、Spring 3 では名前付きパラメーターを使用できます。
http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html#jdbc-in-clauseを参照してください。
プリミティブのリストを取り、リストを展開する必要があります。リストが DB がサポートする最大サイズを超えないように注意してください。(Oracle の制限は 1000 です)。このようなものが動作するはずです:
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);
ids.add(3);
Map<String,Object> params = new HashMap<String, Object>();
String sql = "SELECT PERSON.ID, PERSON.USERNAME, PERSON.EMAIL_ADDRESS, PERSON.FIRST_NAME, PERSON.LAST_NAME, PERSON.ACCOUNT_STATUS FROM PERSON WHERE ID IN (:ids)";
params.put("ids",ids);
return getSimpleJdbcTemplate().query(sql, rowMapper, params);