Frage

Ich möchte eine Tabelle mit einem Varchar -Primärschlüssel verwalten, der im kartierten Java -Objekt ein UUID sein sollte.

Ich habe mein 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>

und das user.xml ist wie das:

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

Wie auch immer, ich habe diese Ausnahme bekommen:

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'

Es scheint, dass mein Typhandler niemals angerufen wird (ich habe es ein bisschen angemeldet, aber nie etwas druckt).Stimmt irgendetwas nicht?Danke.

War es hilfreich?

Lösung 2

Es scheint etwas seltsam, meine eigene Frage zu beantworten, aber ich habe Hilfe auf der Mybatis-Benutzerliste erhalten, daher möchte ich hier einige Hinweise geben:

Mybatis hat versucht, ein nicht vorhandenes Feld zu „bekommen“:Glücklicherweise hat mir einer der mybatis-Entwickler vor einiger Zeit geholfen und vorgeschlagen, dass der einfachste Weg, es zum Laufen zu bringen, darin besteht, a hinzuzufügen @Param Anmerkung im UserMapper, um Folgendes zu tun:

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> 

Ich war festgefahren, die TypeHandler -Konfiguration zu beobachten, aber wenn ich sie richtig verstanden habe, hat dies nicht viel mit Typhandlern zu tun, da sie verwendet werden, da sie Daten zwischen der SQL -Tabelle und den Java -Objekten "transportieren" und "transportieren" werden (über Setter und Getters ), während mein Problem im Umgang mit den Methodenparametern lag.Hoffe, das hilft jemandem.

Andere Tipps

Ihr Problem liegt genau dort in Ihrer Ausnahme ...

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

Verwenden Sie den Parametertyp „String“ und übergeben Sie eine eindeutige ID als Argument.Sie benötigen keinen Typhandler.

Dieser Fehler könnte auch behoben werden, indem in der Mapper-Datei eine neue Methode mit entsprechender Warteschlange hinzugefügt wirdSmth so was:

@Select("SELECT * FROM Users u WHERE u.userUUID = '${uuid}'")
User selectByUserUuid(@Param("uuid") UUID uuid);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top