Question

Je veux gérer une table avec une clé primaire VARCHAR, que dans l'objet Java mappé devrait être un UUID.

J'ai mon 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>

et le user.xml c'est comme ça :

<?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 toute façon, j'ai cette exception :

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'

Il semble que mon type Handleur ne soit jamais appelé (je l'ai un peu enregistré, mais n'imprime jamais rien).Y a-t-il quelque chose qui ne va pas?Merci.

Était-ce utile?

La solution 2

Cela semble un peu étrange de répondre à ma propre question, mais j'ai obtenu de l'aide sur la liste des utilisateurs de mybatis, j'aimerais donc partager quelques indices ici :

Mybatis essayait de "récupérer" un champ inexistant :Heureusement, l'un des développeurs de mybatis m'a aidé il y a quelque temps, en suggérant que le moyen le plus simple de le faire fonctionner était d'ajouter un @Param annotation dans le UserMapper pour faire cette chose :

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> 

J'ai été coincé à regarder la configuration de typehandler, mais, si je les comprenais correctement, cela n'a pas grand-chose à voir avec les Handlers, car ils sont utilisés pour "transporter et traduire" les données entre la table SQL et les objets Java (via Setter et Getters ), alors que mon problème était dans la gestion des paramètres des méthodes.J'espère que cela aide quelqu'un.

Autres conseils

Votre problème est là, dans votre exception....

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

Utilisez un type de paramètre String et transmettez un identifiant unique comme argument.Vous n'avez pas besoin d'un gestionnaire de type.

Une telle erreur pourrait également être corrigée en ajoutant dans le fichier mappeur une nouvelle méthode avec la file d'attente correspondanteSmth comme ça:

@Select("SELECT * FROM Users u WHERE u.userUUID = '${uuid}'")
User selectByUserUuid(@Param("uuid") UUID uuid);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top