O banco de dados mysql em mbatis usa a condição in, o número excede 1000 e a solução para o relatório de erro

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>

Acho que você gosta

Origin blog.csdn.net/qq798867485/article/details/130490301
Recomendado
Clasificación