当前位置: 首页 > 知识库问答 >
问题:

选择提供程序Mybatis错误:找不到参数“arg0”。可用参数为[productAttributeDto,param1]

常波
2023-03-14

我在spring boot应用程序中使用Mybatis。在那里我使用ProviderMethodResolver生成MySql查询。我的应用程序支持mybatis注释处理器和XML处理器。

为了实现这一点,我使用了以下Mybatis配置:

mybatis.mapper-locations=classpath*:/repository/**/*Repository.xml
@Configuration
@EnableTransactionManagement
public class MybatisConfiguration {

    @Bean
    ConfigurationCustomizer mybatisConfigurationCustomizer() {
        return new ConfigurationCustomizer() {
            @Override
            public void customize(org.apache.ibatis.session.Configuration configuration) {
                configuration.setMapUnderscoreToCamelCase(true);
                configuration.setCacheEnabled(true);
            }
        };
    }
}

SelectProvider Implemetation是

variantrepository.java

@Mapper
public interface VariantRepository {

    @SelectProvider(type = VariantSqlProvider.class, method = "getProductAttribute")
    VariantDto findByProductAttribute(@Param("productAttributeDto") ProductAttributeDto productAttributeDto);
}

我正在使用org.apache.ibatis.annotations.param

@Data
public class ProductAttributeDto {

    private Integer productId;

    Map<String, String> attributes;
}
  public class VariantSqlProvider implements ProviderMethodResolver {

    @SuppressWarnings("unused")
    public static String getProductAttribute(final ProductAttributeDto productAttributeDto) {
        return new SQL() {{
            SELECT("*");
            FROM("ec_product_variant AS pv");
            if (Objects.nonNull(productAttributeDto.getAttributes())) {
                for (Entry<String, String> entry : productAttributeDto.getAttributes().entrySet()) {
                    if(Objects.nonNull(entry.getValue())) {
                        INNER_JOIN(
                                new StringBuilder("ec_attributes AS ")
                                .append(entry.getKey())
                                .append(" ON ")
                                .append(entry.getKey()).append(".id = pv.").append(entry.getKey())
                                .append(" AND ")
                                .append(entry.getKey()).append(".value=#{productAttributeDto.attributes.").append(entry.getKey())
                                .append("}").toString()
                        );
                    } else {
                        WHERE("pv." + entry.getKey() + " IS NULL");
                    }
                }
            }
            if(Objects.nonNull(productAttributeDto.getProductId())) {
                WHERE("pv.product_id = #{productAttributeDto.productId}");
            }
        }}.toString();
    }
}
org.apache.juli.logging.DirectJDKLog: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method 'public static java.lang.String com.ecommerce.app.repository.product.sqlprovider.VariantSqlProvider.getProductAttribute(com.ecommerce.app.model.product.ProductAttributeDto)' with specify parameter 'class org.apache.ibatis.binding.MapperMethod$ParamMap'.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'arg0' not found. Available parameters are [productAttributeDto, param1]] with root cause
org.apache.ibatis.binding.BindingException: Parameter 'arg0' not found. Available parameters are [productAttributeDto, param1]
        at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:212)
        at org.apache.ibatis.builder.annotation.ProviderSqlSource.extractProviderMethodArguments(ProviderSqlSource.java:223)
SELECT *
FROM ec_product_variant AS pv 
INNER JOIN ec_attributes AS color ON color.id = pv.color AND color.value=? 
WHERE (pv.size IS NULL AND pv.product_id = ?)

查询基于productAttributeDto中的attributes键值对

这里mybatis寻找的是arg0,而不是ProductAttributedTo。有人能帮忙吗。我在这里做错了什么?提前谢了。

共有1个答案

双俊人
2023-03-14

该错误是由映射器方法和提供程序方法之间的参数名不匹配引起的。

  • 映射器方法的参数名称由@param注释指定,即ProductAttributedTo.
  • provider方法中未指定param名称,因此使用默认名称arg0

这些名字必须匹配。

    null
public static String getProductAttribute(
  @Param("productAttributeDto") final ProductAttributeDto productAttributeDto) {

解决方案2取决于如何构建应用程序。

如果使用Maven,可能需要在pom.xml中配置maven-compiler-plugin。例如。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
        <compilerArgs>
          <arg>-parameters</arg>
        </compilerArgs>
      </configuration>
    </plugin>

使用IDE时,可能需要配置生成设置。

    null

因此,映射器方法可以更简单。

@SelectProvider(type = VariantSqlProvider.class, method = "getProductAttribute")
VariantDto findByProductAttribute(ProductAttributeDto productAttributeDto);

...你的问题中的提供者方法应该按原样工作。

 类似资料:
  • 我试图将Apache Camel(2.20.0)与mybatis组件一起使用。更具体地说,我必须将一个大集合或记录从数据库导出到文件。我想防止内存问题,所以我想使用consumer.useIterator选项。我的路线是: 谢谢你。

  • 问题内容: 我已经转换一个到一个通过使用。然后,我尝试将其乘以0.01,但是出现一个错误,提示这是我的代码: 通过阅读其他文章,似乎答案与类型有关。例如,如果将类型设置为Integer,则它将收到类似的错误。我尝试将类型更改为Int,但这似乎无法解决问题。 我也曾尝试设置“海峡”和“pennyCount”作为类型和和的所有组合,和。我的猜测是问题与函数将a转换为an有关。 有人可以帮忙弄清楚问题可

  • 问题内容: 我得到错误: 我也尝试过 和 但 工作良好。正确的语法是什么? 问题答案: 有一个功能:

  • 问题内容: 我收到一个错误 找不到接受提供的参数的’/’的重载 我试图通过做修复: 但随后将getAverage设置为而不是 问题答案: 在Swift中没有这样的隐式转换,因此您必须自己明确地进行转换: 来自 Swift编程语言 :“永远不会将值隐式转换为其他类型。” (部分:快速浏览) 但是您现在使用的是Swift,而不是Objective-C,因此请尝试以更加面向功能的方式进行思考。您的函数可

  • 问题内容: 最近,我与队友讨论了 在方法中使用可选参数的问题。 假设方法是 接受一个和 可选参数 ,它返回该目录中列出的书籍,如果还传递了类别,则仅返回该类别中的书籍。 冲突点是,验证是否为空检查。我认为不应对此进行空检查,因为它是可选参数。函数的调用者可以通过或,并且函数应在实现中处理两种情况。 我的意见是,对于可选参数,只会使方法的约定更加明确。只需查看方法签名即可知道此参数是可选的,不需要读

  • 最近,我和我的队友讨论了在方法中使用作为可选参数。 假设方法是 我的观点是,对于可选参数,只会使方法的契约更加清晰。只要看一下方法签名就可以知道这个参数是可选的,不需要读取JavaDocs。但当他不想使用该可选参数时,不应强制他传递。 我的队友有不同的看法。他希望对其进行空检查,从而强制调用方始终传递。他的观点是为什么我们要通过一个空的可选选项。此外,看起来比更易读。 这个方法在我们的一个库包中,