jdbc模板多次执行select查询

lc8prwob  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(401)

我有一个类似下面的问题

select STUDENT_REGN from STUDENT where STUDENT_ROLL = :stRoll and STUDENT_ROLL_TYPE = :rType

用户最多可以给出5种不同的 student_rollstudent_roll_type 这是唯一用来识别学生的。我想通过命名参数jdbc模板执行这个查询。
但问题是,我必须在一个循环中为5个不同的用户输入运行这个查询5次。是否有一种方法可以在一次数据库调用中获取所有5种组合的记录,从而获得更好的性能?
我无法在代码中执行select*并过滤掉记录,因为表中有大量记录。我也不允许在运行时构建动态查询。

axr492tv

axr492tv1#

不容易。你可以写一个联合体,或者使用 IN ,或使用parens和 ANDOR :

select STUDENT_REGN from STUDENT where STUDENT_ROLL = :stRoll1
  and STUDENT_ROLL_TYPE = :rType1

UNION

select STUDENT_REGN from STUDENT where STUDENT_ROLL = :stRoll2
  and STUDENT_ROLL_TYPE = :rType2

...

虽然您必须对“5个组合”部分进行“硬编码”,并且始终必须指定10个实际值(从 stRoll1rType1 另一种选择是先编写一些代码来构造这个查询。
类似的诡计也可以用来代替工会:

select STUDENT_REGN from STUDENT where STUDENT_ROLL IN (:stRoll)
  and STUDENT_ROLL_TYPE IN (:rType)

但是[1]这可能不是你想要的(任何rtype和任何漫步的组合都会匹配,我认为你想要的是所有与特定的roll/type组合匹配的学生,而不是“任何一个roll是这些组合中的任何一个,其类型是这些组合中的任何一个的学生”,并且[2]我不完全确定jdbctemplate是否能够旋转单个 ? 成倍 ?, ?, ? 缩放到列表输入的大小。
剩下的是:

select STUDENT_REGN from STUDENT where 
  (STUDENT_ROLL = :stRoll1 and STUDENT_ROLL_TYPE = :rType1) OR
  (STUDENT_ROLL = :stRoll2 and STUDENT_ROLL_TYPE = :rType2) OR
  (STUDENT_ROLL = :stRoll3 and STUDENT_ROLL_TYPE = :rType3) OR
  (STUDENT_ROLL = :stRoll4 and STUDENT_ROLL_TYPE = :rType4) OR
  (STUDENT_ROLL = :stRoll5 and STUDENT_ROLL_TYPE = :rType5);

你也可以很容易地构造这个(记住, where false OR ... 同样有效,而且查询优化器不会因为这个毫无意义的问题而慢下来 or -因此,您可以重复添加一个简单的字符串( " OR (STUDENT_ROLL = :stRoll" + idx + " and STUDENT_ROLL_TYPE = :rType" + idx + ")" ).

相关问题