java - NamedParameterJdbcTemplate 和组合键

标签 java spring-data jdbctemplate named-parameters

我编写了一个方法来使用 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;
}

但这仅在 key 为简单类型时才有效。 我无法使其与主键一起使用,例如:

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(有点破解;也适用于 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 NamedParameterUtilsofficial documentation关于这个话题。

使用 map 参数的示例

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());
}

关于java - NamedParameterJdbcTemplate 和组合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20103405/

相关文章:

Spring 数据 MongoDB 示例不起作用

spring-data - 如何使用 QueryDslJpaRepository?

java - 插入具有重复唯一键的记录时如何获取主键

java - SpringFramework JdbcTemplate RowMapper

java - 在 3 个 Activity 之间传递值

java - 从方法获取返回值以在 for 循环中使用

java - Laravel exec() 在队列作业中

java - Spring Data MongoDB 集合聚合

java - 在 Spring JdbcTemplate 中提取输出参数与结果集

java - 如何将列表中的项目打印到 JTextArea?