uuid пользовательский манипулятор mybatis - PullRequest
1 голос
/ 18 февраля 2011

Я хочу управлять таблицей с первичным ключом 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'

похоже, что мой обработчик никогда не вызывается (у меня есть логирование немного, но никогда ничего не печатает). Что-то не так? Спасибо.

Ответы [ 3 ]

2 голосов
/ 04 марта 2011

Ваша проблема прямо в вашем исключении ....

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

Используйте тип параметра String и передайте уникальный идентификатор в качестве аргумента.Вам не нужен обработчик типа.

1 голос
/ 28 сентября 2012

Также такую ​​ошибку можно исправить, добавив в файл mapper новый метод с соответствующей очередью Smth как это:

@Select("SELECT * FROM Users u WHERE u.userUUID = '${uuid}'")
User selectByUserUuid(@Param("uuid") UUID uuid);
1 голос
/ 12 марта 2011

Кажется немного странным, отвечая на мой собственный вопрос, но я получил некоторую помощь в списке пользователей mybatis, поэтому я хотел бы поделиться некоторыми советами здесь:

Mybatis пытался «получить» несуществующее поле: К счастью, один из разработчиков mybatis некоторое время назад помог мне, предположив, что самый простой способ заставить его работать, это добавить аннотацию @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 (через сеттер и геттер), в то время как мой Проблема заключалась в обработке параметров методов. Надеюсь, это кому-нибудь поможет.

...