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 相同的值。
我想使用 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 相同的值。