首页 > 解决方案 > 我的 batis - 没有找到用于属性的类型处理程序 - 与集合进行映射

问题描述

我正在尝试使用带有 spring boot 的 mybatis 获取数据。我创建了映射器接口以及带有 resultMap 和查询的 xml 文件,但出现错误:

java.lang.IllegalStateException:没有找到属性 patientId 的类型处理程序

我的解决方案可能有什么问题?

目标对象:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class PatientBandDailySynchronizationStatisticsDTO {

    private UUID patientId;
    private String firstName;
    private String lastName;
    private List<BandDailySynchronizationStatisticsDTO> bandDailySynchronizationStatistics;
}

目标内部对象:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class BandDailySynchronizationStatisticsDTO {

    private LocalDate date;
    private long gsrCount;
    private long ibiCount;
    private long temperatureCount;
    private LocalDate synchronizationDate;
}

映射器接口:

@Mapper
public interface PatientBandDailySynchronizationStatisticsMapper {

    List<PatientBandDailySynchronizationStatisticsDTO> queryAll(@Param("patientIds")List<UUID> patientIds,
                                                                @Param("startDate") LocalDate startDate,
                                                                @Param("endDate") LocalDate endDate);

}

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="com.e1s.bambino.band.statistics.synchronization.mapper.PatientBandDailySynchronizationStatisticsMapper">

    <resultMap type="com.e1s.bambino.band.statistics.synchronization.PatientBandDailySynchronizationStatisticsDTO"
               id="patientStatisticsMap">
        <result property="patientId" column="id"/>
        <result property="firstName" column="first_name"/>
        <result property="lastName" column="last_name"/>
        <collection property="bandDailySynchronizationStatistics"
                    ofType="com.e1s.bambino.band.statistics.synchronization.BandDailySynchronizationStatisticsDTO"
                    javaType="List"
                    resultMap="statisticsMap">
        </collection>
    </resultMap>

    <resultMap type="com.e1s.bambino.band.statistics.synchronization.BandDailySynchronizationStatisticsDTO"
               id="statisticsMap">
        <result property="date" column="date"/>
        <result property="gsrCount" column="gsr_count"/>
        <result property="ibiCount" column="ibi_count"/>
        <result property="temperatureCount" column="temperature_count"/>
        <result property="synchronizationDate" column="synchronization_date"/>
    </resultMap>

    <select id="queryAll" resultMap="patientStatisticsMap">
        SELECT p.id, p.first_name, p.last_name FROM patient p
        LEFT OUTER JOIN band_daily_synchronization_statistics bs
        ON bs.patient_id = p.id
        WHERE p.id IN #{patientIds}
        AND (bs.id IS NULL OR bs.date BETWEEN #{startDate} AND #{endDate})
    </select>
</mapper>

我将映射器接口放入

src/main/java/com/e1s/bambino/band/statistics/synchronization/BandDailySynchronizationStatisticsMapper.java

对应的xml在:

src/main/resources/com/e1s/bambino/band/statistics/synchronization/PatientBandDailySynchronizationStatisticsMapper.xml

我通过构造函数将映射器注入到我的服务中。

@Service
@RequiredArgsConstructor
public class BandDailySynchronizationStatisticsService {

    private final PatientBandDailySynchronizationStatisticsMapper mapper;
    
    public List<PatientBandDailySynchronizationStatisticsDTO> searchBandDailySynchronizationStatistics(BandDailySynchronizationStatisticsSearchCriteria searchCriteria) {
        List<PatientBandDailySynchronizationStatisticsDTO> allForPatients = mapper.queryAll(searchCriteria.getPatientIds(), searchCriteria.getStartDate(),
                searchCriteria.getEndDate());
        return allForPatients;
    }

例外:

    Caused by: org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. The XML location is 'com/e1s/bambino/band/statistics/synchronization/PatientBandDailySynchronizationStatisticsMapper.xml'. Cause: java.lang.IllegalStateException: No typehandler found for property patientId
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:123)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.parse(XMLMapperBuilder.java:95)
    at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.loadXmlResource(MapperAnnotationBuilder.java:179)
    at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.parse(MapperAnnotationBuilder.java:118)
    at org.apache.ibatis.binding.MapperRegistry.addMapper(MapperRegistry.java:72)
    at org.apache.ibatis.session.Configuration.addMapper(Configuration.java:819)
    at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:80)
    ... 75 more
Caused by: java.lang.IllegalStateException: No typehandler found for property patientId
    at org.apache.ibatis.mapping.ResultMapping$Builder.validate(ResultMapping.java:151)
    at org.apache.ibatis.mapping.ResultMapping$Builder.build(ResultMapping.java:140)
    at org.apache.ibatis.builder.MapperBuilderAssistant.buildResultMapping(MapperBuilderAssistant.java:446)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.buildResultMappingFromContext(XMLMapperBuilder.java:393)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:280)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:254)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements(XMLMapperBuilder.java:246)
    at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:119)
    ... 81 more

提前感谢所有回复。

标签: javaspring-bootmybatis

解决方案


推荐阅读