Mybatisには、基本的にID(整数)のセットであるIN句を含むクエリがあります。
適切なレコードをプルアップするために、このIN句に整数配列を渡す方法に行き詰まっています。IDを含む文字列をIN句に渡してみましたが、これは期待どおりに機能しませんでした。
以下のコードサンプル
注釈を使用したMybatisメソッド
@Select(SEL_QUERY)
@Results(value = {@Result(property="id",column="ID")})
List<Integer> getIds(@Param("usrIds") Integer[] usrIds);
クエリ
select distinct ID from table a where a.id in ( #{usrIds} )
メソッド呼び出し
Integer[] arr = new Integer[2];
arr[0] = 1;
arr[1] = 2;
mapper.getIds(arr)
これは機能していません。マッパーメソッドを呼び出すと、Mybatisがエラーをスローします。
何か提案してください
動的SQLに関するmyBatisユーザーガイド には、foreachループを使用してクエリ文字列を作成する方法の例があり、リストと配列に対して機能します。
リリース3.2より前は、動的SQLを使用するためにxml構成を使用する必要がありましたが、新しいバージョンでは、 動的SQLを注釈で を使用することもできるはずです。
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
はい、アノテーションを使用して行うことができます。
postgresqlを使用している場合、 この投稿では のように実行できます。
MySQLを使用している場合は、コードサンプルで次の変更を試してください。
注釈を使用したMybatisメソッド
@Select(SEL_QUERY)
@Results(value = {@Result(property="id",column="ID")})
List<Integer> getIds(@Param("usrIds") String usrIds);
クエリ(MySQLを使用)
select distinct ID from table a where FIND_IN_SET( a.id, #{usrIds}) <> 0
メソッド呼び出し
Integer[] arr = new Integer[2];
arr[0] = 1;
arr[1] = 2;
String usrIds= "";
for (int id : ids) {
usrIds += id + ",";
}
mapper.getIds(usrIds)
新しいタイプハンドラーを作成して、パラメーターにのみ使用できます。クエリは次のように変わります。
SELECT ... WHERE FIND_IN_SET(id, #{usrIds, typeHandler=my.pkg.ListTypeHandler}) <> 0
そして型ハンドラ:
import Java.sql.PreparedStatement;
import Java.sql.SQLException;
import org.Apache.ibatis.type.JdbcType;
import org.Apache.ibatis.type.ObjectTypeHandler;
import com.google.common.base.Joiner;
public class ListTypeHandler extends ObjectTypeHandler {
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
ps.setObject(i, Joiner.on(",").join((Iterable<?>) parameter), JdbcType.OTHER.TYPE_CODE);
}
}