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'

文字列のパラメータタイプを使用し、引数として一意の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開発者の1人が少し前に私を助けてくれました。これを機能させる最も簡単な方法@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オブジェクトの間で(セッターとゲッターを介して)データを「転送および変換」するために使用されるためです。 )、私の問題はメソッドのパラメータの処理にありました。これが誰かを助けることを願っています。

于 2011-03-12T00:08:47.067 に答える