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

Spring中的MyBatis与Sql Builder和注释

狄信然
2023-03-14
@Select("<script> "
    + "SELECT * FROM user "
    + "<where>"
    + "<if test=\"username != null\"> OR username LIKE '%' #{username} '%' </if>"
    + "<if test=\"name != null\"> OR name LIKE '%' #{name} '%' </if>"
    + "<if test=\"email != null\"> OR email LIKE '%' #{email} '%' </if>"
    + "</where>"
    + " </script>")
public List<User> findByDynamicFilter(@Param("username") String username, 
        @Param("name") String name, @Param("email") String email);
@SelectProvider(type = UserSqlBuilder.class, method = "buildFindByDynamicFilter")
public List<User> findByDynamicFilter(@Param("username") String username, 
        @Param("name") String name, @Param("email") String email);
public class UserSqlBuilder {

    public static String buildFindByDynamicFilter(final String username, final String name, final String email) {
        return new SQL() {
            {
                SELECT("*");
                FROM("user");
                if (name != null) {
                    OR().WHERE("name like #{name} || '%'");
                }
                if (username != null) {
                    OR().WHERE("username like #{username}");
                }
                if (email != null) {
                    OR().WHERE("email like #{email} || '%'");
                }
            }
        }.toString();
    }

}

错误:

2018-12-12 19:47:12.935错误7454---[nio-8080-exec-1]O.A.C.C.C.[.[.[/].[dispatcherServlet]:servlet.Service()对于路径[]上下文中的servlet[dispatcherServlet]抛出异常[请求处理失败;嵌套异常为org.mybatis.spring.mybatissystemException:嵌套异常为org.apache.ibatis.builder.builderException:调用SqlProvider方法(br.com.andre.springmvcuser.mapper.sqlBuilder.UserSQLBuilder.BuildFindByDynamicFilter)的错误。原因:org.apache.ibatis.Binding.BindingException:找到。可用参数为[name,param3,param1,email,username,param2]]

BindingException:找不到参数“arg0”。可用的参数有:[name,param3,param1,email,username,param2]在org.apache.ibatis.binding.mappermethod$parammap.get(MapperMethod.java:204)~[mybatis-3.4.6.jar:3.4.6]在org.apache.ibatis.builder.annotation.providersqlsource.extractProviderMethodArguments(Providersqlsource:156)~[mybatis-3.4.6.jar:3.4.6]在6]在org.apache.ibatis.builder.annotation.providersqlsource.getBoundSQL(providersqlsource.java:102)~[MyBatis-3.4.6.jar:3.4.6]在org.apache.ibatis.mapping.mappedStatement.getBoundSQL(mappdStatement.java:292)~[MyBatis-3.4.6.jar:3.4.6]在org.apache.ibatis.executor.cachingExecutor.query(cachingExecutor.java:81)~[MyBatis-3.4.6.jar:3.4.6]在org.apache.ibatis.session.defaults.defaultsqlsession.selectlist(aultsqlsession.java:148)~[mybatis-3.4.6.jar:3.4.6]在org.apache.ibatis.session.defaults.defaultsqlsession.selectlist(defaultsqlsession.javA:141)~[mybatis-3.4.6.jar:3.4.6]在sun.reflect.nativeMethodAccessorImpl.invoke0(原生方法)~[na:1.8.0_191]在sun.reflect.

这些参数[name,param3,param1,email,username,param2]]是什么?

我做SqlBuilder的方式还需要什么吗?

共有1个答案

令狐宣
2023-03-14

出现这个问题是因为mybatis无法将参数从映射器方法传递给生成器。

您要么需要在生成器中注释参数:

public static String buildFindByDynamicFilter(
   final @Param("username") String username,
   final @Param("name") String name,
   final @Param("email") String email) {

或者从生成器方法签名中移除未使用的参数(在您的情况下,可以移除所有参数,因为生成器中没有使用这些参数):

public static String buildFindByDynamicFilter() {
    ...
} 
 类似资料:
  • 这不仅仅是一个简单的问题,我的英语没有我想要的那么好...我会尽力的。 我必须指定@results注释和每个@result,还是可以使用java模型类?我尝试了@resultmap(value={“mycompany.model.preingest”}),但它不起作用。 最重要的是,如文档中所述,使用SQL builder可以访问方法参数,并将它们作为最终对象 但是如果我把这些final放在我的方

  • SqlBuilder 是一个Java的类库,它试图帮你避免在Java程序内直接书写SQL查询的痛苦。你只需要使用 SqlBuilder 的方法,它就可以帮你生成对应的 SQL 数据库查询语句,例如下面一个SQL语句: String selectQuery = "SELECT " + T1_COL1 + "," + T1_COL2 + "," + T2_COL1 + " FROM " + TAB

  • 在中是否存在防止SQL注入的好方法? 我将此方法用于。实际上,我在查询中使用用户给出的字符串参数。 有什么想法吗?

  • 本文向大家介绍Spring与Mybatis基于注解整合Redis的方法,包括了Spring与Mybatis基于注解整合Redis的方法的使用技巧和注意事项,需要的朋友参考一下 基于这段时间折腾redis遇到了各种问题,想着整理一下。本文主要介绍基于Spring+Mybatis以注解的形式整合Redis。废话少说,进入正题。   首先准备Redis,我下的是Windows版,下载后直接启动redis

  • 有人能解释一下Spring3中的和注释吗?它们是干什么用的?任何例子都很好。

  • 本文向大家介绍详解Java的MyBatis框架与Spring框架整合中的映射器注入,包括了详解Java的MyBatis框架与Spring框架整合中的映射器注入的使用技巧和注意事项,需要的朋友参考一下 MyBatis-Spring允许你在Service Bean中注入映射器。当使用映射器时,就像调用DAO那样来调用映射器就可以了,但是此时你就不需要进行任何DAO实现的编码,因为MyBatis会为你进