Mybatis错误:设置参数时发生错误

时间:2013-10-24 06:00:38

标签: mybatis

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.UnsupportedOperationException
### The error may exist in kr/co/techinmotion/mybatis/mappers/dataOutputMapper.xml
### The error may involve kr.co.techinmotion.mybatis.mappers.dataOutputMapper.selectData1-Inline
### The error occurred while setting parameters
### SQL: select * from tbl_id, tbl_feed     where tbl_id.id = tbl_feed.upid     and tbl_id.token = ?
### Cause: java.lang.UnsupportedOperationException
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
at kr.co.techinmotion.daoImpl.DataDaoImplMybatis.selectData1(DataDaoImplMybatis.java:47)

我不知道为什么会发生这个错误。

这是我在mapper中的sql。

<select id="selectData1" parameterType="string" resultType="list">
    select * from tbl_id, tbl_feed  
    where tbl_id.id = tbl_feed.upid  
    and tbl_id.token = #{token}
</select>

和..这是DAO。

public class DataDaoImplMybatis implements IdataDao {

    private DataDaoImplMybatis(){}

    private static DataDaoImplMybatis dao;

    public static DataDaoImplMybatis getInstance(){
        if(dao == null){
            dao = new DataDaoImplMybatis();
        }

        return dao;
    }

    SqlSessionFactory sessionFactory = SqlMapSessionFactory.getSqlSessionFactory();

    @Override
    public List<DataResult1> selectData1(String token){
        SqlSession session = sessionFactory.openSession();
        List<DataResult1> list = session.selectList("kr.co.techinmotion.mybatis.mappers.dataOutputMapper.selectData1", token);
        session.close();

        return list;
    }

}

请帮帮我.. T_T

5 个答案:

答案 0 :(得分:2)

&#34; MyBatis-3-User-Guide&#34;说: resultType:将从此语句返回的预期类型的​​完全限定类名或别名。请注意,对于集合,这应该是集合包含的类型,而不是集合本身的类型。使用resultType或resultMap,而不是两者。

答案 1 :(得分:0)

resultType 不应该是列表,下面显示了修改后的类型,但是你必须确保select语句可以相应地映射到DataResult1

<select id="selectData1" parameterType="string" resultType="DataResult1">
    select * from tbl_id, tbl_feed  
    where tbl_id.id = tbl_feed.upid  
    and tbl_id.token = #{token}
</select>

或者,你可以试试这个:

<select id="selectData1" parameterType="string" resultType="map">
    select * from tbl_id, tbl_feed  
    where tbl_id.id = tbl_feed.upid  
    and tbl_id.token = #{token}
</select>

以及对java源代码的更改

List<Map<String,Object> list = session.selectList("kr.co.techinmotion.mybatis.mappers.dataOutputMapper.selectData1", token);

答案 2 :(得分:0)

1楼是正确的,但我想说resultType = ""尊重数据库中的一行但不是全部,也许您可​​以从用户选择count(user_id),现在是resultType = 'long',如果你选择两个以上的结果,您可以使用resultType = 'map'或自己的地图,resultType = 'yourselfMap'

答案 3 :(得分:0)

您必须声明变量的“jdbcType = VARCHAR”或“jdbcType = NUM​​ERIC”,具体取决于传递的变量类型以传递空值。试试这个:

<select id="selectData1" parameterType="string" resultType="map">
    select * from tbl_id, tbl_feed  
    where tbl_id.id = tbl_feed.upid  
    and tbl_id.token = #{token,jdbcType=VARCHAR}
</select>

答案 4 :(得分:0)

在我的情况下,在jdbc.url中添加了'useUnicode = true&characterEncoding = utf8&autoReconnect = true&allowMultiQueries = true',这解决了我的问题:)

jdbc.url=jdbc:mysql://127.0.0.1:3306/xxx?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true