Ответ 1
Чтобы использовать конфигурацию TypeHandler, MyBatis должен знать как тип Java результирующего объекта, так и тип SQL исходного столбца.
Здесь мы используем resultType
в <select />
, поэтому MyBatis знает тип Java, но он не может знать тип SQL, если мы его не установим. Единственный способ - использовать <resultMap />
.
Решение
Вам нужно создать Bean с одним полем, содержащим объект, который вы хотите вернуть (назовем это поле time
) и используйте <resultMap />
:
<select id="getLastNotifTime" resultMap="notifMailResultMap">
<resultMap id="mapLastTime" type="MyWrapperBean">
<result property="time" column="my_sql_timestamp" javaType="org.joda.time.LocalDateTime"
jdbcType="TIMESTAMP" />
</resultMap>
Если вы хотите зарезервировать создание выделенного bean, вы также можете использовать атрибут type=hashmap
на своем <resultMap />
, как предлагается Shobit.
Вариант: установите свойство на LocalDateTime
A решение было предложено в группах Google, которое непосредственно устанавливает информацию о LocalDateTime
.
Мое понимание этого (прокомментируйте, если я ошибаюсь) заключается в том, что он устанавливает свойство LocalDateTime
. Я не буду ручаться за него, так как я не нашел соответствующее в API doc (и я его не тестировал), но не стесняйтесь использовать если вы сочтете это лучше.
<resultMap id="mapLastTime" type="org.joda.time.LocalDateTime">
<result property="lastTime" column="my_sql_timestamp" javaType="org.joda.time.LocalDateTime"
jdbcType="TIMESTAMP" />
</resultMap>
Почему он работает с java.sql.Timestamp
Timestamp
- стандартный Java-тип для SQL с реализацией JDBC по умолчанию (ResultSet.getTimestamp(int/String)
). Обработчик по умолчанию для MyBatis использует этот getter 1 и поэтому не нуждается в сопоставлении TypeHandler. Я ожидаю, что это произойдет каждый раз, когда вы используете один из обработчиков по умолчанию.
1: Это догадка. Требуется ссылка!
Этот ответ ожидает только замены чего-то лучшего. Пожалуйста, внесите свой вклад!