web-dev-qa-db-ja.com

MyBatisで整数配列をIN句に渡す方法

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がエラーをスローします。

何か提案してください

24
Vivek

動的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>
33
Jörn Horstmann

はい、アノテーションを使用して行うことができます。

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) 
6
Italo Borssatto

新しいタイプハンドラーを作成して、パラメーターにのみ使用できます。クエリは次のように変わります。

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);
    }
}
1
Italo Borssatto