当前位置: 首页 > 知识库问答 >
问题:

使用NamedParameterJdbcTemplate的批选择操作

呼延震博
2023-03-14

我的源代码:

//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子句的select查询,而不是update或insert操作。我知道,对于更新和插入,namedparameterJDBCtemplate提供了一个batchUpdate方法。

共有1个答案

齐航
2023-03-14

不幸的是,你并没有告诉我们你的问题是什么。但有几件事似乎有问题。

>

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

    您正在一个紧密的循环中多次运行相同的语句。在一个单一的语句中转换它可能更有效,或者至少比目前少得多。这可以通过使用UNION组合select语句的多个副本来实现,或者如果您知道它们是不同的UNION ALL。当然,您必须更改参数名,因此它们是唯一的。

    或者,也可以使用in-子句。我知道你明确地要求解决方案,但你上面有,你没有给出理由,所以我在这一节中忽略这个限制。挑战在于您有两个参数要筛选。这本身似乎很奇怪,因为其中一个参数名为id,这表明它应该是唯一的。下面的解决方案假设有一个字符,您可以保证它不出现在ID中。我使用_和一个示例。那么下面的语句应该起到这个作用:

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

    查询参数IDsIDnames需要设置为ID值的集合,即连接ID+“_”+名称。中的第一个将限制第二个要处理的行数,并希望使用索引,而第二个不能使用索引,但执行正确的筛选。

    由于只选择单个列,因此可以使用QueryForListQueryForObject并删除RowMapper

  •  类似资料:
    • 问题内容: 可以说我的网页中包含以下代码段: >这是一些文字> 我希望WebDriver在此文本中选择“一些”,就像用户选择它一样。我应该怎么做?我知道如何获取>元素: println打印“这是一些文本”。 我尝试将键发送到该元素,该键曾经可以工作(在selenium 2.0b中),但是我现在正在使用selenium 2.6.0,但它停止了工作: 有人有想法吗?我正在使用FirefoxDriver

    • 一条指令可以有零或多个操作数-指令操作的数据。零操作数的一个例子是NOP(no operation)。操作数可以在下面的位置: 位于指令本身(立即数) 位于寄存器(EAX, EBX, ECX, EDX, ESI, EDI, ESP, 或者EBP,如果是32位操作数;AX, BX, CX, DX, SI, DI, SP, 或者BP,如果是16位操作数;AH, AL, BH, BL, CH, CL,

    •  那么,在学习使用选择支之前,首先必须要对标签进行说明。  如果要让玩家进行选择,就必须控制选择之后,跳跃到对应的剧本继续执行。这时候,控制这种跳转的标记,就是标签。  标签是行头标记有 * 符号的一行。到现在为止的范例中已经出现一些标签了。比如说・・・ [waittime=200] *start|开始 [cm] 你好。  像这样。这种情况下,这里就定义了这样一个标签 *start 。而 | (竖

    • 通话时可选择的操作     通话时若按下按钮,会显示选项选单。可保留通话或显示个人信息。 保留 保留通话。 拨号盘 输入号码。 可向对方传送音频信号。可于录音机等,需输入号码的通话时使用。 挂断 切断通话。 检视个人信息 显示对方的个人信息。

    • 我试图批量插入一个表,然后用新生成的s读回完整的对象。 然而,这个方法给了我以下错误:。请参阅下面的堆栈跟踪。 如果我只想批量插入而不回读,一切都会好起来的。那我就用 但是,我还需要用插入的值的s读回它们,但不确定我可以使用什么方法。 TLDR:我想批量插入,然后使用读取插入的行,但找不到正确的方法。是否在单个方法中提供批量插入和选择?

    • 问题内容: 我有一个使用JDBC的Java应用程序,该应用程序每天在服务器上运行一次,并与也在同一服务器上运行的MySQL数据库(v5.5)进行交互。该应用程序正在查询并遍历表中的 所有 行。 该表目前很小(约5000行),但将无限期地增长。我的服务器内存有限,我不认为应用程序的内存消耗不确定。 如果我在运行查询之前使用过,我不清楚这里发生了什么。例如,如果我使用类似: 这是如何适当控制潜在的大型