Benutzerdefinierter UUID-Typhandler mybatis
-
15-11-2019 - |
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.
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);