我编写了一种方法来检索具有NamedParameterJdbcTemplate的条目列表:
public final Map<K,V> findAll(final Collection<K> keys) {
if (keys == null) {
return null;
}
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("ids", keys);
List<V> values = new NamedParameterJdbcTemplate(datasource).query("select * from TABLE where id in ( :ids )", parameters, mapper);
Map<K,V> results = new HashMap<K, V>();
for (V v : values) {
results.put((K) v.getId(), v);
}
return results;
}
但这仅在键为简单类型时有效。
我无法使其与像这样的主键一起使用:
public class CompositeKey implements Serializable {
private long field1;
private long field2;
}
如何使用复合键使我的findAll()方法工作?
最佳答案
您的问题应分部分回答:
SELECT
和元组比较IN
SELECT
编写此类NamedParameterJdbcTemplate
如何使用compund PK查询多个对象
PostgreSQL / MySQL(也可能是Oracle):
SELECT * FROM foo WHERE (field1, field2) IN ((1, 1), (1, 3));
SQL Server(有点hack;也可以在PostgreSQL中使用):
SELECT * FROM foo
INNER JOIN (VALUES (1, 1), (1, 3)) AS _CONDITION(field1, field2) ON
foo.field1 = _CONDITION.field1 AND foo.field2 = _CONDITION.field2;
如何使用NamedParameterJdbcTemplate进行查询
使用
List<Object[]>
作为参数类型。有关此主题,请参见JavaDoc for NamedParameterUtils或official documentation。使用地图参数的示例
public List<MyObject> findByIds(Collection<MyKey> keys) {
List<Object[]> keyTuples = new ArrayList<Object[]>(keys.size());
for (MyKey key : keys) {
keyTuples.add(new Object[] { key.getField1(), key.getField2() });
}
jdbcTemplate.query("SELECT * FROM my_table WHERE (field1, field2) IN (:keys)",
Collections.singletonMap("keys", keyTuples), new MyObjectRowMapper());
}