【问题标题】:Mybatis ResultHandler with spring boot could not run带有spring boot的Mybatis ResultHandler无法运行
【发布时间】:2019-11-17 14:09:26
【问题描述】:

我有一个结果很大的查询,所以我使用 ResultHandler 跟踪来自 MyBatis 的文档来处理结果

因为我只是想把所有结果放到一个 Map 中,以便 ResultHandler 可以帮助我。

@Mapper
Interface ObjRepository {
  @Result(value = {....})
  @Select("SELECT .... FROM .... 
          JOIN .... JOIN ... WHERE country = #{country} ...")
  Void consumeResult(@Parram('country') String country, ResultHanlder<MyObjDto> handle)
}

Spring boot 自动为我创建一个 ObjRepository 实例,我在其他类中使用它

@Sfl4j
@Service
public class MyService {
  private Map<Long, MyObjDto> map = new HashMap();

  @Autowired ObjRepository objRepository;

  @PostConstruct
  public init() {
    Log.info("start loading");
    objReposity.consumeResult("US", dto -> map.put(dto.getId(), dto)); 
    Log.info("finish");
  }

}

我的问题是当我启动 Spring Boot 应用程序时,它会卡在函数 consumeResult 中并且永远不会完成这个函数。

我试图从 MyBatis 中查找文档,但一无所获。我配置错了吗?我正在为当前项目使用 PostgreSql

【问题讨论】:

  • 似乎有一个错字(@Result -> @Results),但除此之外,它看起来还可以。尝试使用像these 这样的最小项目来重现问题。如果你可以在 GitHub 上分享它,我会研究它。如果很难,请启用日志记录并找出卡住的确切位置(查询、映射结果等)。

标签: java spring postgresql spring-boot mybatis


【解决方案1】:

深入研究后,我发现了一些问题。

  • 返回类型必须是void 而不是Void
  • 语句必须有@ResultMap@ResultType。不支持@Result,好像是[1]。
  • 传递给ResultHandler#handleResult()的参数是ResultContext,所以你需要调用getResultObject()来获取你的DTO。

    objReposity.consumeResult("US", resultContext -> {
      MyObjDto dto = resultContext.getResultObject();
      map.put(dto.getId(), dto);
    });
    

[1] 在不研究实现的情况下,从技术上讲,支持@Results 是可能的。您应该在tracker 上创建增强请求。


可能有用的其他信息。

  • 有一个方便的注解@MapKey 可以在不使用ResultHandler 的情况下实现相同的映射,但是当查询返回很多行时它可能不是最佳解决方案。

    @MapKey("id")
    @Results({@Result(), @Result(),...})
    @Select("SELECT .... FROM .... 
            JOIN .... JOIN ... WHERE country = #{country} ...")
    Map<Integer, MyObjDto> select(@Param('country') String country)
    
  • 在处理大量行时,使用Cursor 可能更有效。详情请见documentation

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多