如何在MyBatis中迭代List

时间:2017-03-23 20:14:46

标签: mybatis

iBatis to MyBatis Migration:

需要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代码逻辑的正确查询。

1 个答案:

答案 0 :(得分:0)

分隔符值周围缺少空格: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>)