mybatis-mapper / mapper

MyBatis Mapper
https://mapper.mybatis.io
Apache License 2.0
325 stars 47 forks source link

扩展根据id批量删除,第一次删除成功,执行第二次还是第一次的参数,没有替换掉 #23

Closed li362692680 closed 2 years ago

li362692680 commented 2 years ago

扩展根据id批量删除,第一次删除成功,执行第二次还是第一次的参数,没有替换掉,扩展方法如下,帮忙看看是哪里有问题

  /**
     * @return 根据id批量删除
     */
    public static String deleteBatchIds(ProviderContext providerContext, List<?> idList) {
        if (idList == null || idList.size() == 0) {
            throw new NullPointerException( "Parameter cannot be empty" );
        }
        return SqlScript.caching( providerContext, new SqlScript() {
            @Override
            public String getSql(EntityTable entity) {
                return "DELETE FROM " + entity.table()
                        + where( () ->
                        entity.idColumns().stream().map( entityColumn -> entityColumn.column() 
                                + " IN (" + idList.stream().map( String::valueOf ).collect( Collectors.joining( "," ) ) + ")" ).collect( Collectors.joining( " AND " ) ) );
            }
        } );
    }
abel533 commented 2 years ago

通用方法实现中不能使用具体值,你这里不要在方法注入 idList,在接口定义上通过 @Param("idList") 注解配置。

getSql 方法返回中,通过 foreach 对 idList 进行动态处理。

abel533 commented 2 years ago

foreach 可以参考:

https://github.com/mybatis-mapper/mapper/blob/5d00353958fcdeb44ab6e8ea19352ec49fbf753e/mapper/src/main/java/io/mybatis/mapper/list/ListProvider.java#L44-L49

abel533 commented 2 years ago

有类似的现成方法。。用default默认方法实现更简单。

https://github.com/mybatis-mapper/mapper/blob/5d00353958fcdeb44ab6e8ea19352ec49fbf753e/mapper/src/main/java/io/mybatis/mapper/Mapper.java#L109

li362692680 commented 2 years ago

明白了,多谢!