NamedParameterJdbcTemplate和复合键

pat*_*nzi 3 java named-parameters jdbctemplate spring-data

我编写了一种方法来检索具有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;
}
Run Code Online (Sandbox Code Playgroud)

但这仅在键为简单类型时有效。我无法使用像这样的主键来工作:

public class CompositeKey implements Serializable {

    private long field1;
    private long field2;
}
Run Code Online (Sandbox Code Playgroud)

如何使用复合键使我的findAll()方法工作?

Pav*_*ral 5

您的问题应分部分回答:

  • 如何SELECT使用组合IN和元组比较编写
  • 如何编写这样SELECT使用NamedParameterJdbcTemplate

如何使用compund PK查询多个对象

PostgreSQL / MySQL(可能还有Oracle):

 SELECT * FROM foo WHERE (field1, field2) IN ((1, 1), (1, 3));
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

如何使用NamedParameterJdbcTemplate进行查询

使用List<Object[]>为您的参数类型。请参阅JavaDoc for NamedParameterUtils或有关此主题的官方文档

使用地图参数的示例

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());
}
Run Code Online (Sandbox Code Playgroud)