【问题标题】:Batch Select operation using NamedParameterJdbcTemplate使用 NamedParameterJdbcTemplate 进行批量选择操作
【发布时间】:2021-12-28 05:46:35
【问题描述】:

我需要有关NamedParameterJdbcTemplate 中选择查询的批处理操作方面的帮助。我有一个List 的员工有idname,对此我需要员工项目代码的唯一列表,最终它将添加到所有员工的所有项目的最终列表中。

我的源代码:

//input = List<Employee> employee

String sql = "Select project_name from employee where id = :id and name = :name";

RowMapper<String> rowMapper = (rs, rowNum) ->
{
String s = rs.getString("project_name");
return s;
};


MapSqlParameterSource params;
List<String> finalProjectList = new ArrayList<String>();
List<String> employeeProjectList = null;
for(Employee e : employee)
{
params = new MapSqlParameterSource();
employeeProjectList = new ArrayList<String>();

params.addvalue("id",e.getId());
params.addvalue("name",e.getName());

employeeProjectList = namedParameterJdbcTemplate.query(sql, params, rowMapper);
finalProjectList.addAll(employeeProjectList);
}

注意:请回答没有 IN 子句的选择查询,而不是更新或插入操作。我知道对于更新和插入,NamedParameterJdbcTemplate 提供了一个 batchUpdate 方法。

【问题讨论】:

    标签: java sql spring spring-jdbc


    【解决方案1】:

    很遗憾,您并没有真正告诉我们您的问题是什么。 但有几件事似乎有问题。

    1. finalProjectList.addAll(finalProjectList) 只是一个花哨的 NOOP,因为 finalProjectList 是空的并且会保持这种状态。这应该是finalProjectList.addAll(employeeProjectList)吗?

    2. 您在一个紧密的循环中多次运行相同的语句。将其转换为单个语句或至少比您当前的语句更少可能更有效。这可以通过使用UNION or if you know they are distinct UNION ALL 组合选择语句的多个副本来完成。当然,您必须更改参数名称,因此它们是唯一的。

    3. 您也可以使用 IN 子句。我知道你明确要求没有 IN 的解决方案,但你有上面的,你没有给出理由,所以我将在本节中忽略这个约束。挑战在于您有两个要过滤的参数。这本身似乎很奇怪,因为其中一个参数称为id,这表明它应该是唯一的。以下解决方案假设有一个字符可以保证它不会出现在id 中。我使用_ 和一个例子。那么下面的语句应该可以解决问题:

      SELECT project_name 
      FROM employee 
      WHERE id IN :ids 
      AND CONCAT(id, name) IN :idnames
      

      查询参数idsidnames 然后需要设置为id 值的集合,并连接id + "_" + name。第一个IN 将限制第二个IN 处理的行数并希望使用索引,而第二个不能使用索引但会进行正确的过滤。

    4. 由于您只选择单个列,您可以使用queryForListqueryForObject 并删除RowMapper

    【讨论】:

    • 感谢您的回复。回应您的观点:问题是这里的效率。获取几千条记录需要花费大量时间。 1 - 这是一个错字,是的,它是 finalProjectList.addAll(employeeProjectList); 2 - 无法更改的旧式查询。我在问题中画了一个例子来传达我的问题 3 - 不是试图在这里更改查询,但是好的方法感谢你。 4 - 同样,这是一个示例 - 它也可以返回我需要的多个列
    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多