MyBatis: ClassCastException: java.lang.Integer cannot be cast to java.lang.Boolean

12,217

UPDATE query does not return a boolean type. It returns an integer depicting the number of rows successfully updated. And you have given a return type of boolean to your updateUser which is using UPDATE query.

Change the return type of updateUser to int. I hope that would work then.

Share:
12,217
Arturas M
Author by

Arturas M

I'm a technology enthusiast and a Java Software Engineer

Updated on June 04, 2022

Comments

  • Arturas M
    Arturas M almost 2 years

    I'm getting this exception in MyBatis while trying to execute the update statement(UpdateUser):

    java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Boolean
    at $Proxy6.updateUser(Unknown Source)
    at com.nortal.pirs.persistence.dbmybatis.UserDaoMyBatisImpl.updateUser(UserDaoMyBatisImpl.java:60)
    at com.nortal.pirs.test.persistence.UserDaoAbstractTest.testUpdateUser(UserDaoAbstractTest.java:117)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    

    My Data type User with which I'm working looks like this:

    public class User {
    private String firstName = "";
    private String lastName = "";
    private String personCode = "";
    private Date birthDate = new Date();
    private Gender gender = Gender.MALE;
    private String email = "";
    private String password = "";
    private UserState userState = UserState.UNAPPROVED;
    
    public User() {
    }
    

    with the apropriate gettters and setters of course.

    My UserMapper.java interface for mybatis looks as follows:

    public interface UserMapper {
    
    public User getUserByEmail(String email);   
    
    public void addUser(User user);
    
    public void removeUser(String email);
    
    public int getNumberOfUsers();
    
    public int userExists(String email);
    
    public boolean updateUser(@Param ("oldUser") User oldUser, @Param("newUser") User newUser);
    
    public Map<String, User> getAllUsers();
    

    }

    And my UserMapper.xml looks like this:

     <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
      PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
      "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.nortal.pirs.persistence.dbmybatis.UserMapper">
    
        <!-- QUESTION: Is the <cache /> needed as described in one of your examples? And what is it meant to do? -->
    
        <resultMap id="UserMap" type="com.nortal.pirs.datamodel.User">
            <result property="firstName" column="firstName"/>
            <result property="lastName" column="lastName"/>
            <result property="personCode" column="personCode"/>
            <result property="birthDate" column="birthDate" javaType="Date"/>
            <result property="gender" column="gender" javaType="com.nortal.pirs.datamodel.Gender"/>
            <result property="email" column="email"/>
            <result property="password" column="password"/>
            <result property="userState" column="userState" javaType="com.nortal.pirs.datamodel.UserState"/>        
        </resultMap>
    
        <select id="getUserByEmail" parameterType="String" resultMap="UserMap">
            SELECT 
            firstName,
            lastName,
            personCode,
            birthDate,
            gender,
            email,
            password,
            userState       
            FROM   USER 
            WHERE  email = #{email}
        </select>
    
        <insert id="addUser" parameterType="User" >
            INSERT INTO user
    
            (firstName,
            lastName,
            personCode,
            birthDate,
            gender,
            email,
            password,
            userState)
    
            VALUES
            (#{firstName},
            #{lastName},
            #{personCode},
            #{birthDate},
            #{gender},
            #{email},
            #{password},
            #{userState})        
        </insert>
    
        <delete id="removeUser" parameterType="String">
            DELETE FROM user
            WHERE email = #{email}
        </delete>
    
    
        <select id="getNumberOfUsers" resultType="int">
            SELECT
            COUNT(email)
            FROM USER
        </select>
    
        <select id="userExists" parameterType="String" resultType="int">
            SELECT CASE WHEN EXISTS (
                SELECT
                COUNT(email)
                FROM USER)
        </select>
    
        <update id="updateUser" parameterType="map">
            UPDATE user
            SET 
            firstName = #{newUser.firstName},
            lastName = #{newUser.lastName},
            personCode = #{newUser.personCode},
            birthDate = #{newUser.birthDate},
            gender = #{newUser.gender},
            email = #{newUser.email},
            password = #{newUser.password},
            userState = #{newUser.userState}
            WHERE email = #{oldUser.email}
        </update>
    
    </mapper>
    

    as I've mentioned the exception is thrown when updateUser is called. The strange thing is I can't even see anything Integer related here. I mean I even tried testing with just updating one field. It's all the same. I don't get the exception only if the query is totally removed, I would get the query error or something error...

    Any suggestions? Thanks in advance.

    Edit: if people are voting my question down without saying anything, they should at least tell what was wrong with the question, that would be more helpful... I haven't posted this question out of fun. Indeed I'm kinda stuck on this for some time now...