首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MyBatis ' in‘子句中的列表

MyBatis ' in‘子句中的列表
EN

Stack Overflow用户
提问于 2016-06-17 15:16:55
回答 4查看 42K关注 0票数 18

如何将Integer列表传递给MyBatis XML,以便在MySQL查询中的in子句中使用?

我使用的是Java7、MySQL 5.6DB和MyBatis 3.0.4,使用的是mapper-xml文件中的查询。

目前,我正在将这个整数列表转换为一个字符串,并使用string替换(${}操作符)将值放入' in‘子句--尽管它按预期工作,但这种方法使参数容易受到注入的影响。

我尝试过使用<foreach>元素,但无法确定要指定哪些属性。

下面是一个示例代码:

代码语言:javascript
复制
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);
}

Mapper xml :

代码语言:javascript
复制
<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

下面是堆栈跟踪:

代码语言:javascript
复制
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]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-05-17 10:16:25

当与列表一起使用时,item属性指定的值应该在foreach标记中使用。用途如下:

代码语言:javascript
复制
    <foreach item="sId" collection="stripperIds" separator="," open="(" close=")">
        #{sId}
    </foreach>

在使用列表时,索引设置不是强制性的。有关更多信息,请参考MyBatis docs部分,或查看DTD - http://mybatis.org/dtd/mybatis-3-mapper.dtd获取有关参数的更多信息:

代码语言:javascript
复制
    <!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
    >

此外,对象列表也可以按以下方式在前端进行访问。您通常会将其用于INSERT/UPDATE语句:

豆样:

代码语言:javascript
复制
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;
    }       
}

在执行过程中:

代码语言:javascript
复制
    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);

在mapper xml中:

代码语言:javascript
复制
    <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>

很好的问题BTW :)

票数 18
EN

Stack Overflow用户

发布于 2017-05-26 16:33:37

使用注释应该更容易一些。

代码语言:javascript
复制
@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);
票数 12
EN

Stack Overflow用户

发布于 2016-07-29 15:31:14

您的xml应该如下所示:

代码语言:javascript
复制
<foreach item="item" index="index" collection="stripperIds" open="(" separator="," close=")">
    #{item}
</foreach>

当使用Map (或Map.Entry对象集合)时,索引将是关键对象,item将是值对象。

有关详细信息,可以参考这里。您将对这些属性有一个坚实的理解。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37885076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档