Pergunta

Quero gerenciar uma tabela com uma chave primária Varchar, que no objeto Java mapeado deve ser um UUID.

eu tenho meu 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>

e a user.xml é assim:

<?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>

de qualquer forma, recebi esta exceção:

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'

Parece que meu TypeHandler nunca é chamado (eu o fiz um pouco, mas nunca imprime nada).Há algo de errado?Obrigado.

Foi útil?

Solução 2

Parece meio estranho responder minha própria pergunta, mas recebi ajuda na lista de usuários do mybatis, então gostaria de compartilhar algumas dicas aqui:

Mybatis estava tentando "obter" um campo inexistente:Felizmente, um dos desenvolvedores do mybatis me ajudou há algum tempo, sugerindo que a maneira mais fácil de fazê-lo funcionar era adicionar um @Param anotação no UserMapper para fazer isso:

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> 

Fiquei preso ao assistir a configuração do TypeHandler, mas, se eu entendi direito, isso não tem muito a ver com os TypeHandlers, pois eles são usados ​​para "transportar e traduzir" os dados entre a tabela SQL e os objetos Java (através do Setter e Getters ), enquanto meu problema estava no manuseio dos parâmetros dos métodos.Espero que isso ajude alguém.

Outras dicas

Seu problema está aí na sua exceção....

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

Use um tipo de parâmetro String e passe um id exclusivo como argumento.Você não precisa de um manipulador de tipo.

Além disso, esse erro pode ser corrigido adicionando um novo método ao arquivo mapeador com a fila correspondenteSmth assim:

@Select("SELECT * FROM Users u WHERE u.userUUID = '${uuid}'")
User selectByUserUuid(@Param("uuid") UUID uuid);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top