我正在使用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)
我不知道如何解决这个问题。
请帮帮我。
答案 0 :(得分:0)
你是对的,这应该有效。您应该能够使用多个key =“parameterName”和value =“parameterValue”传递一个映射。其中一个映射条目可能是一个列表,就像你正在做的那样(该映射条目有key =“idSplits”和value = yourArrayList)。一些想法:
您能否提供BuddyIdResultMap的定义(必须在mybatis映射中定义它,以定义哪些列转到哪个数据成员以及返回的对象类型)。
您是否可以检查“idSplits”列表是否为空或其中包含有趣的元素?
map.put(“idSplits”,new ArrayList(Arrays.asList(idSplits)));
要取消阻止,您可以为每个需要传递给映射器的参数传入一个POJO(Plain Old Java Object)和一个数据成员。列表的一个数据成员。像这样:
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)
<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版本。