O banco de dados mysql em springboot-mbatis usa a condição in, e o número excede 1000, e a solução para o relatório de erro
Use o banco de dados mysql no projeto, use as condições de consulta de in e a solução para o número excessivo. Por exemplo, o sql é o seguinte:
selecione * da tabela onde id in (1,2,...10000), se o número de in exceder 1000, um erro será relatado
Solução 1: agrupe os números em e consulte várias vezes. É melhor classificar primeiro, o que pode reduzir o tempo de consulta (quando há um índice)
List<Long> newAllReceiveIdList = allReceiveIdList.stream().sorted().distinct().collect(Collectors.toList());
List<List<Long>> partitionReceiveIdList = Lists.partition(newAllReceiveIdList, 800);
List<ReceiveBill> receiveBillList = new ArrayList<>();
for (List<Long> singlePartitionReceiveIdList : partitionReceiveIdList) {
if(CollUtil.isNotEmpty(singlePartitionReceiveIdList)){
LambdaQueryWrapper<ReceiveBill> receiveBillLambdaQueryWrapper = new LambdaQueryWrapper<ReceiveBill>()
.in(ReceiveBill::getId, singlePartitionReceiveIdList)
.eq(ReceiveBill::getDeleted, BoolEnum.NO.getKey());
List<ReceiveBill> billList = receiveBillService.list(receiveBillLambdaQueryWrapper);
receiveBillList.addAll(billList);
}
}
Solução 2: modifique sql diretamente, separado por ou
Altere para o seguinte sql: select * from table where id in (1,2,...999) or (1000,1001,...1888)
Como o framework mybatis é usado no projeto, cada valor é separado por um ',' separador, resultando em uma vírgula extra no final, então você precisa adicionar null
selecione * da tabela onde id em (1,2,……998,nulo)ou (998,1000,1001,…1888)
<if test="bo.receiveIds != null and bo.receiveIds.length != 0">
and (
f.id in
<foreach item='receiveId' index='index' collection='bo.receiveIds' open='(' separator=',' close=')'>
<if test = 'index%999== 998'>
null ) or f.id in (
</if>
#{receiveId}
</foreach>
)
</if>