1

我想管理一个带有 VARCHAR 主键的表,在映射的 java 对象中应该是一个 UUID。

我有我的sql-map-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
       <properties resource="database.properties"/>
   <typeHandlers>
       <typeHandler
handler="[...].persistence.typehandlers.UuidTypeHandler"
                    javaType="java.util.UUID"
                    jdbcType="VARCHAR"/>
   </typeHandlers>
       <environments default="development">
               <environment id="development">
                       <transactionManager type="JDBC" />
                       <dataSource type="POOLED">
                               <property name="driver" value="${driver}" />
                               <property name="url" value="${url}" />
                               <property name="username" value="${username}" />
                               <property name="password" value="${password}" />
                       </dataSource>
               </environment>
       </environments>
       <mappers>
               <mapper resource="user.xml" />
   </mappers>
</configuration>

user.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="[...].persistence.mappers.UserMapper">

   <select id="selectUserByUUID" parameterType="java.util.UUID"
resultMap="userResultMap">
       SELECT * FROM user WHERE uuid = #{uuid, jdbcType=VARCHAR,
typeHandler=[...].persistence.typehandlers.UuidTypeHandler}
   </select>
   <resultMap id="userResultMap" type="[...].model.User">
       <id property="uuid" column="uuid" jdbcType="OTHER"
typeHandler="[...].persistence.typehandlers.UuidTypeHandler"/>
       ...
   </resultMap>
</mapper>

无论如何,我得到了这个例外:

org.apache.ibatis.exceptions.PersistenceException:
### Error querying database.  Cause:
org.apache.ibatis.reflection.ReflectionException: There is no getter
for property named 'uuid' in 'class java.util.UUID'
### The error may involve
[...].persistence.mappers.UserMapper.selectUserByUUID-Inline
### The error occurred while setting parameters
### Cause: org.apache.ibatis.reflection.ReflectionException: There is
no getter for property named 'uuid' in 'class java.util.UUID'

似乎我的类型处理程序从未被调用(我让它记录了一下,但从不打印任何东西)。有什么不对?谢谢。

4

3 回答 3

2

你的问题就在你的例外中......

There is no getter for property named 'uuid' in 'class java.util.UUID'

使用 String 的参数类型,并将唯一 id 作为参数传入。您不需要类型处理程序。

于 2011-03-04T00:42:48.973 回答
1

也可以通过在映射器文件中添加具有相应队列的新方法来修复此类错误, Smth如下所示:

@Select("SELECT * FROM Users u WHERE u.userUUID = '${uuid}'")
User selectByUserUuid(@Param("uuid") UUID uuid);
于 2012-09-27T20:02:31.880 回答
1

回答我自己的问题似乎有点奇怪,但我在 mybatis-users 列表上得到了一些帮助,所以我想在这里分享一些提示:

Mybatis 试图“获取”一个不存在的字段:幸运的是,mybatis 的一位开发人员不久前帮助了我,建议让它工作的最简单方法是@Param在 UserMapper 中添加一个注释来做这件事:

public User selectUserByUUID(@Param("uuid") UUID uuid);

<select id="selectUserByUUID" parameterType="uuid" resultMap="userResultMap"> 
SELECT * FROM user WHERE uuid = #{uuid, typeHandler=com.collective.persistence.typehandlers.UuidTypeHandler, javaType=uuid, jdbcType=VARCHAR}
</select> 

我一直在看类型处理程序的配置,但是,如果我理解正确的话,这与类型处理程序没有太大关系,因为它们用于在 sql 表和 java 对象之间“传输和翻译”数据(通过 setter 和 getter ),而我的问题是处理方法的参数。希望这可以帮助某人。

于 2011-03-12T00:08:47.067 回答