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…
UPDATEquery does not return abooleantype. It returns anintegerdepicting the number ofrowssuccessfully updated. And you have given a return type ofbooleanto yourupdateUserwhich is usingUPDATEquery.Change the return type of
updateUsertoint. I hope that would work then.