Mybatis foreach集合是map-parameter

时间:2015-05-18 06:16:10

标签: java jdbc mybatis

我正在使用mybatis 3.2.8版本。

Mapper.java

List<BuddyId> findBuddyIds(HashMap<String, Object> map);

XML

<select id="findBuddyIds" parameterType="map" resultMap="BuddyIdResultMap">
select * 
from seerid.buddyIds
where id REGEXP
<foreach collection="idSplits" item="item" index="index" open="'" close="'" separator="|">
    #{item}
</foreach>
</select>

Controller.java

HashMap<String,Object> map = new HashMap<String,Object>();

map.put("idSplits", new ArrayList<String>(Arrays.asList(idSplits)));

buddyScanResult = seerIdDAO.findBuddyIds(map);

会收到以下错误。

  

查询数据库时出错。原因:java.sql.SQLException:无法设置参数

     

该错误可能存在于文件中[/Users/jylee/Documents/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/services/WEB-INF/classes/com/ohinc /services/seerid/mybatis/SeerIdMapper.xml]

     

该错误可能涉及com.ohinc.services.seerid.mybatis.SeerIdMapper.findBuddyIds-Inline

     

设置参数

时发生错误      

SQL:select * from seerid.buddyIds where id REGEXP'? | ? “

     

原因:java.sql.SQLException:无法设置参数;未分类的SQL []的SQLException; SQL状态[null];错误代码

     

[0];无法设置参数;嵌套异常是   java.sql.SQLException:无法根据原因设置参数   org.mariadb.jdbc.internal.common.query.IllegalParameterException:否   '?'在那个位置上   org.mariadb.jdbc.internal.common.query.MySQLParameterizedQuery.setParameter(MySQLParameterizedQuery.java:103)

我不知道如何解决这个问题。

请帮帮我。

3 个答案:

答案 0 :(得分:0)

你是对的,这应该有效。您应该能够使用多个key =“parameterName”和value =“parameterValue”传递一个映射。其中一个映射条目可能是一个列表,就像你正在做的那样(该映射条目有key =“idSplits”和value = yourArrayList)。一些想法:

  1. 您能否提供BuddyIdResultMap的定义(必须在mybatis映射中定义它,以定义哪些列转到哪个数据成员以及返回的对象类型)。

  2. 您是否可以检查“idSplits”列表是否为空或其中包含有趣的元素?

    map.put(“idSplits”,new ArrayList(Arrays.asList(idSplits)));

  3. 要取消阻止,您可以为每个需要传递给映射器的参数传入一个POJO(Plain Old Java Object)和一个数据成员。列表的一个数据成员。像这样:

  4. BuddyDTO.java:

    public class BuddyDTO implements Serializable {
      protected String someDataMember = null;
      protected List<String> idSplits= null;
    // insert getter and setters here for data members and idSplits
    }
    

    Mapper.java

    List<BuddyId> findBuddyIds(BuddyDTO dto);
    

    XML

    <select id="findBuddyIds" parameterType="BuddyDTO" resultMap="BuddyIdResultMap">
    select * 
    from seerid.buddyIds -- I'm guessing seerid is your schema name?
    where id REGEXP
    <foreach collection="idSplits" item="item" index="index" open="'" close="'" separator="|">
        #{item}
    </foreach>
    </select>
    

    Controller.java

    BuddyDTO dto = new BuddyDTO();
    dto.setIdSplits( new ArrayList<String>(Arrays.asList(idSplits))) );
    buddyScanResult = seerIdDAO.findBuddyIds(dto);
    

答案 1 :(得分:0)

我发现这个问题,可能可以解决这个问题。 你xml有一个错误:

<profile enabled="true" defaultProvider="MyCustomProfileProvider">
...
</profile>

你应该在foreach中使用$ replace#。

MyBatis Issue with IN Condition <foreach with List inside a Map

答案 2 :(得分:0)

<select id="findBuddyIds" parameterType="map" resultMap="BuddyIdResultMap">
select * 
from seerid.buddyIds
where id REGEXP
<trim prefix="(" prefixOverrides=" " suffixOverrides=" " suffix=")">
    <foreach collection="idSplits" index="index" item="item" open="'" separator="|" close="'">^${item}</foreach>
</trim>
</select>

我正在使用mybatis 3.4.2版本。