2016-06-17 81 views
4

MyBatis XMLに整数リストを渡して、MySQLクエリのin句で使用するにはどうしたらいいですか?MyBatis 'IN'句のリスト

ファイルのクエリでJava 7、MySQL 5.6 DB、MyBatis 3.0.4を使用しています。

現在のところ、私はこの整数のリストを文字列に変換しており、文字列置換(${}演算子)を使用して 'IN'句に値を入れています - 期待通りに動作しますが、このアプローチでは、 。

私は<foreach>要素を使用しようとしましたが、指定する属性を特定できません。

public List<Stripper> getStripperDetails(String club, List<Integer> stripperIds) { 
     Map<String, Object> input = new HashMap<>(); 
     input.put("club", club); 
     input.put("stripperIds", stripperIds); 
     return stripClubMapper.getStripperDetails(input); 
} 

マッパーXML::以下

は、サンプルのJavaコードである

<select id="getStripperDetails" parameterType="java.util.HashMap" resultMap="StripperMap"> 
    SELECT STRIPPER_ID, STAGE_NAME, REAL_NAME, CLUB FROM EXOTIC_DANCERS WHERE CLUB = #{club} AND STRIPPER_ID IN  
    <foreach item="item" index="index" collection="stripperIds" open="(" separator="," close=")"> 
     #{index} 
    </foreach> 
</select> 

私は<foreach>要素に指定する属性のかを把握することはできませんよ - 私は続けます#{index}の値に対してNullPointerExceptionを実行しています。

<foreach>要素の正しい使い方を理解できますか?

編集:以下

は、スタックトレースがある

、10086 @:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database. Cause: java.lang.NullPointerException 
### The error may involve com.stripclub.mapper.stripClubMapper.getStripperDetails-Inline 
### The error occurred while setting parameters 
### Cause: java.lang.NullPointerException 
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:67) ~[mybatis-spring-1.0.0-RC3.jar:1.0.0-RC3] 
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:345) ~[mybatis-spring-1.0.0-RC3.jar:1.0.0-RC3] 
    at com.sun.proxy.$Proxy208.selectList(Unknown Source) ~[na:na] 
    at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:193) ~[mybatis-spring-1.0.0-RC3.jar:1.0.0-RC3] 
    at org.apache.ibatis.binding.MapperMethod.executeForList(MapperMethod.java:85) ~[mybatis-3.0.4.jar:3.0.4] 
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:65) ~[mybatis-3.0.4.jar:3.0.4] 
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:38) ~[mybatis-3.0.4.jar:3.0.4] 
    at com.sun.proxy.$Proxy209.getTransactionIds(Unknown Source) ~[na:na] 
+1

私は、このような[**この1 **](http://stackoverflow.com/questions/18388936/how-to-iterate-through-など、いくつかの関連の質問をチェックして簡単にする必要がありますhashmap-in-mybatis-foreach?lq = 1)、foreach属性の指定方法を知ることができません。以下は[** dtd **](http://mybatis.org/dtd/mybatis-3-mapper.dtd)のサンプルです。 '<!ELEMENTますforeach!(#PCDATA |含ん|トリム|設定| |どこのforeach |]を選択します|場合|バインド)*> bub

+1

あなたのストリッパーIDはマップに空白か空白ですか? – Blank

+0

いいえ、strippperIdsはnull/emptyではありません。値はありません。 – bub

答えて

3

リストで使用する場合、foreachタグ内でitem属性で指定した値を使用する必要があります。以下のように使用します。

<foreach item="sId" collection="stripperIds" separator="," open="(" close=")"> 
     #{sId} 
    </foreach> 

リストを使用している場合、インデックスattibuteが、必須ではありません。詳細はMyBatisのドキュメントのセクションを参照してください、またはDTDチェックアウト - パラメータについての詳細はhttp://mybatis.org/dtd/mybatis-3-mapper.dtdを:

<!ELEMENT foreach (#PCDATA | include | trim | where | set | foreach | choose | if | bind)*> 
    <!ATTLIST foreach 
    collection CDATA #REQUIRED 
    item CDATA #IMPLIED 
    index CDATA #IMPLIED 
    open CDATA #IMPLIED 
    close CDATA #IMPLIED 
    separator CDATA #IMPLIED 
    > 

また、オブジェクトのリストは以下のようにforeachの中でアクセスすることができます。

サンプル豆:

public class StripperBean { 

    public StripperBean(int stripperID, String stripperName, String realName) { 
     this.stripperID = stripperID; 
     this.stripperName = stripperName; 
     this.realName = realName; 
    } 

    private int stripperID; 
    private String stripperName; 
    private String realName;   

    public int getStripperID() { 
     return stripperID; 
    } 
    public void setStripperID(int stripperID) { 
     this.stripperID = stripperID; 
    } 
    public String getStripperName() { 
     return stripperName; 
    } 
    public void setStripperName(String stripperName) { 
     this.stripperName = stripperName; 
    } 
    public String getRealName() { 
     return realName; 
    } 
    public void setRealName(String realName) { 
     this.realName = realName; 
    }  
} 

あなたの実装で:マッパーXMLで

Map<String, Object> input = new HashMap<>(); 
    input.put("club", club); 
    List<StripperBean> strippers = new ArrayList<>(); 
    strippers.add(new StripperBean(1,"Ashley", "Jean Grey")); 
    strippers.add(new StripperBean(2,"Candice","Diana Prince")); 
    strippers.add(new StripperBean(3,"Cristal","Lara Croft"));   
    input.put("strippers", strippers); 
    return stripClubMapper.saveStripperDetails(input); 

<insert id="saveStripperDetails"> 
     INSERT INTO EXOTIC_DANCERS (STRIPPER_ID, STAGE_NAME, REAL_NAME) 
     VALUES 
     <foreach item="stripper" collection="input" separator=","> 
      (#{stripper.stripperID}, 
      #{stripper.stripperName}, 
      #{stripper.realName}) 
     </foreach> 
    </select> 

ニースの質問あなたは通常、INSERT/UPDATEステートメントのためにこれを使用しますBTW :)

1

あなたのXMLは次のようにする必要があります:

<foreach item="item" index="index" collection="stripperIds" open="(" separator="," close=")"> 
    #{item} 
</foreach> 

地図を使用して

(またはMap.Entryオブジェクトのコレクション)、インデックスはキーオブジェクトになり、アイテムは値オブジェクトになります。

詳しくは、hereを参照してください。あなたはその属性について確固とした理解を持っています。

0

あなたの入力は地図です。ストリッパーIDを直接入力する前に、ストリッパーIDを入力から解決する必要があります。

1

注釈を使用すると、

@Select({ 
     "<script>", "select", " * ", "FROM TABLE", 
     "WHERE CONDITION IN " + 
     "<foreach item='item' index='index' collection='list' open='(' separator=',' close=')'> #{item} </foreach>" + 
     "</script>" }) 
     @Results({ }) 
     List<POJO> selectByKeys(@Param("list") List<String> ids);