org.apache.ibatis.exceptions.PersistenceException:記錄mybatis 查詢結果對映異常

conlin day發表於2020-12-05

mybatis 查詢返回值對映異常

具體異常

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'name' from result set.  Cause: java.sql.SQLException: Invalid value for getInt() - '張三'
### The error may exist in com/conlin/mapper/UserMapper.xml
### The error may involve com.conlin.mapper.UserMapper.findAll
### The error occurred while handling results
### SQL: select * from mybatis.user
### Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'name' from result set.  Cause: java.sql.SQLException: Invalid value for getInt() - '張三'

異常理解

異常資訊表示,在查詢結果中name值對映為int型別的值,如下:

Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'name' from result set.  Cause: java.sql.SQLException: Invalid value for getInt() - '張三'

原因是在實體中加了有參的構造方法,而未實現無參構造方法或全參構造方法。

解決方法

這個異常主要是因為實體屬性與sql結果無法對應導致。
1、實現無參構造或全參構造,這樣用 select * from mybatis.user 這個sql 查出所用欄位將與user屬性一一對應。
2、在SQL中將 * 替換為需要的欄位,與實體中的構造方法引數對應,如下:

  <select id="findAll" resultType="com.conlin.entity.User">
        select name,age from mybatis.user
  </select>
public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

這樣的話也可以解決上面的異常,但是查詢結果對映為實體後,其他沒有對應的欄位將為空值。

相關文章