MyBatis: ClassCastException: java.lang.Integer cannot be cast to java.lang.Boolean
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.
Arturas M
I'm a technology enthusiast and a Java Software Engineer
Updated on June 04, 2022Comments
-
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...