在尝试执行更新语句(UpdateUser)时,我在 MyBatis 中遇到了这个异常:
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)
我正在使用的数据类型用户如下所示:
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() {
}
当然还有合适的 getter 和 setter。
我的 mybatis 的 UserMapper.java 接口如下所示:
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();
}
我的 UserMapper.xml 看起来像这样:
<?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>
正如我提到的,调用 updateUser 时会引发异常。奇怪的是我什至看不到任何与 Integer 相关的内容。我的意思是我什至尝试只更新一个字段进行测试。这都一样。只有当查询被完全删除时,我才会得到异常,我会得到查询错误或某些错误......
有什么建议么?提前致谢。
编辑:如果人们不说任何话就对我的问题投了反对票,他们至少应该说出问题出了什么问题,那会更有帮助……我没有出于乐趣而发布这个问题。确实,我现在有点卡住了一段时间......