質問

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

私のTypeHandlerは決して呼ばれないようです(私はそれをロギングする ビットですが、何も印刷しません)。 何か問題がありますか?ありがとう。

役に立ちましたか?

解決 2

Seems kinda odd answering my own question, but i got some help on the mybatis-users list, so i'd like to share some hints here:

Mybatis was trying to "get" a non-existing field: Luckily, one of mybatis developers helped me a while ago, suggesting that the easiest way to get it to work was to add a @Param annotation in the UserMapper to do this thing:

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> 

I was stuck in watching the typehandler configuration, but, if I understood it right, this has not much to do with typehandlers, since they are used to "transport and translate" data between the sql table and the java objects (through setter and getters), while my issue was in the handling of methods' parameters. Hope this helps someone.

他のヒント

Your problem is right there in your exception....

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

Use a parameter type of String, and pass in unique id as an argument. You don't need a type handler.

Also such error could be fixed by adding in mapper file new method with corresponding queue Smth like this:

@Select("SELECT * FROM Users u WHERE u.userUUID = '${uuid}'")
User selectByUserUuid(@Param("uuid") UUID uuid);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top