如何在MyBatis中迭代List

问题描述 投票:0回答:1

iBatis 到 MyBatis 迁移:

需要 MyBatis foreach 逻辑的帮助,因为 Map 包含 Value 作为 ArrayList。 下面的java代码是逻辑:

employeeRequest.put("ID", employeeId);
Map <String,ArrayList<String> employeeRequest = new HashMap<String, ArrayList<String>>();
Set<String> employeeSet = new HashSet<String>();
 for(Employee employee: employeeList) {
   String name = employee.getName();
   String value = employee.getValue(); 
  if("EMPLOYEE".equalsIgnoreCase(name) {
    employeeSet.add(value)
  }
}
if(!employeeSet.isEmpty()) {
  employeeRequest.put("EMPLOYEE", new ArrayList<String>(employeeSet))
}

iBatis SQL: 我以前的代码我正在使用具有以下查询的 iBatis

<select id="getEmployeeName" resultclass="java.util.HashMap" parameterClass="java.util.Map">
SELECT EMP.EMPNAM NAME FROM EMPLOYEE EMP
WHERE EMP.ID = #ID#
<isNotEmpty property="EMPLOYEE" prepend="AND">
 <iterate property="EMPLOYEE" conjunction="AND">
  EMP.EMPNAM != #EMPLOYEE[]#
 <iterate>
</isNotEmpty>
</select>

MyBatis SQL: 现在我正在迁移到 MyBatis,所以格式化查询如下

<select id="getEmployeeName" resultclass="java.util.HashMap" parameterClass="java.util.Map">
SELECT EMP.EMPNAM NAME FROM EMPLOYEE EMP
WHERE EMP.ID = #{ID}#
<if test="EMPLOYEE !=null and EMPLOYEE>0">
 <foreach collection="EMPLOYEE" index="index" item="item" separator="AND">
  EMP.EMP_ID != ${item}
 </foreach>
</if>
</select>

你们中的任何一个都可以帮助我正确查询上述 java 代码逻辑吗?

mybatis
1个回答
0
投票

separator值周围缺少空格:

AND
而不仅仅是
AND
.

对于参数,使用

#{param}
来绑定参数,而不是
${param}
只是将值连接到 SQL 字符串。这并不能阻止工作,但这非常糟糕。

!=
不是标准 SQL,不适用于每个数据库供应商(尽管它可能适用于您正在使用的供应商),不像
NOT column = value

<foreach collection="EMPLOYEE" index="index" item="item" separator=" AND ">
  NOT EMP.EMP_ID = #{item}
</foreach>

进一步更好地使用IN

  EMP.EMP_ID NOT IN (<foreach collection="EMPLOYEE" index="index" item="item" separator=", ">
  #{item}
</foreach>)
© www.soinside.com 2019 - 2024. All rights reserved.