为什么 isIn 条件在 MyBatis 中不起作用

Why the isIn condition doesn't work in MyBatis

我写了两个 select 语句,第一个生成了一个 id 列表,第二个我希望 idList 中有 id 的视频将被 selected。我打印了 idList 并确保它是 ,但是 下面的 select 语句返回了 table[=15] 中的所有视频=].

SelectStatementProvider selectStatementProvider = selectDistinct(
        VideoHitDynamicSqlSupport.videoId
)
        .from(VideoHitDynamicSqlSupport.videoHit)
        .where(VideoHitDynamicSqlSupport.hitterId, isEqualTo(uid))
        .build()
        .render(RenderingStrategies.MYBATIS3);

List<VideoHit> videoHits = this.videoHitMapper.selectMany(selectStatementProvider);
ArrayList<Integer> idList = new ArrayList<>();
videoHits.forEach(e -> idList.add(e.getVideoId()));

List<Video> videos = this.videoMapper.select(c -> c
        .where(VideoDynamicSqlSupport.videoId, isIn(idList))
);

return videos;

这是预期的行为。如果返回的 ID 列表为空,则不会呈现 IsIn 条件。

你必须考虑实际的 SQL 会是什么。如果呈现条件,则结果 SQL 将如下所示:

select * from video where videoId in ()

这是无效的SQL。该库不会呈现无效的 SQL,在这种情况下,这意味着不会呈现任何 where 子句 - 因此将返回所有行。