mybatis oracle - 使用 instr func 按 IN 子句中值的顺序排序

mybatis oracle - ordering by the order of values in the IN clause using instr func

我想使用 instr 函数按照 IN 子句中值的顺序对查询结果进行排序。

映射器

public List<String> getFilePaths(@Param("ids") Integer[] ids)

xml

<select id="getFilePaths" resultType="java.lang.String">
  select filepath from t_file where id in
  <foreach item="fileid" collection="ids" separator="," open="(" close=")">
    #{fileid}
  </foreach>
  order by instr('
  <foreach item="fileid" collection="ids" separator=",">
    #{fileid}
  </foreach>
  ',id)
</select>

当ids集合为[1,2,3]时,mybatis生成的sql为:

select filepath from t_file where id in (?, ?, ?) order by instr('?, ?, ?', id)

但是出现异常

org.apache.ibatis.type.TypeException:为 JdbcType 为空的参数 #4 设置非空时出错。

更改xml后进行如下测试,没有出现异常。

<select id="getFilePaths" resultType="java.lang.String">
  select filepath from t_file where id in
  <foreach item="fileid" collection="ids" separator="," open="(" close=")">
    #{fileid}
  </foreach>
  and id in
  <foreach item="fileid" collection="ids" separator="," open="(" close=")">
    #{fileid}
  </foreach>
</select>

Preparing: select filepath from t_file where id in (?, ?, ?) and id in (?, ?, ?)
Parameters: 1, 2, 3, 1, 2, 3

您不能在文字中使用 #{}。在第二个 foreach 循环中使用 ${fileId}
请看这个 FAQ entry.

order by instr('
<foreach item="fileid" collection="ids" separator=",">
  ${fileid}
</foreach>
',id)

可能有一些前提条件,但排序逻辑似乎不可靠。
例如,当 ids[222, 22, 2] 时,INSTR 将为所有三行 return 相同的值。