Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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...

like image 381
Arturas M Avatar asked Jan 19 '26 02:01

Arturas M


1 Answers

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.

like image 93
Rohit Jain Avatar answered Jan 21 '26 14:01

Rohit Jain



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!