Почему условие isIn не работает в MyBatis - PullRequest
1 голос
/ 05 марта 2020

Я написал два оператора select, первое произвело список идентификаторов, во втором, я надеюсь, видео будет иметь идентификатор внутри idList. Я распечатал idList и убедился, что он пуст , но оператор select ниже вернул все видео в таблице .

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;

1 Ответ

2 голосов
/ 07 марта 2020

Это ожидаемое поведение. Если возвращенный список идентификаторов пуст, условие IsIn не будет отображаться.

Вам нужно подумать о том, каким будет фактический SQL. Если условие выполнено, то результирующее SQL будет выглядеть так:

select * from video where videoId in ()

Это недопустимо SQL. Библиотека не будет отображать недопустимый SQL, что в данном случае означает, что никакое предложение where не будет отображено, поэтому возвращаются все строки.

...