首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有Sql和注解的MyBatis在春季

带有Sql和注解的MyBatis在春季
EN

Stack Overflow用户
提问于 2018-12-12 21:57:40
回答 1查看 2.5K关注 0票数 2

我正在用MyBatis在Spring中做一些测试,我决定测试两种使用注释进行sql查询的方法,但是其中一种方法不起作用,我想要一些帮助来理解这个问题。

起作用了:

代码语言:javascript
运行
复制
@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);

不起作用的:

马佩尔

代码语言:javascript
运行
复制
@SelectProvider(type = UserSqlBuilder.class, method = "buildFindByDynamicFilter")
public List<User> findByDynamicFilter(@Param("username") String username, 
        @Param("name") String name, @Param("email") String email);

类SqlBuilder

代码语言:javascript
运行
复制
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.[.[./. dispatcherServlet : Servlet.service() for servlet dispatcherServlet in path []引发异常[请求处理失败;嵌套异常为org.mybatis.spring.MyBatisSystemException:嵌套异常为org.apache.ibatis.builder.BuilderException:错误调用SqlProvider方法org.apache.ibatis.builder.BuilderException原因: org.apache.ibatis.binding.BindingException:找不到参数'arg0‘。可用的参数是名称、param3、param1、email、用户名、param2]。 org.apache.ibatis.binding.BindingException:找不到参数'arg0‘。可用的参数有:名称、param3、param1、电子邮件、用户名、org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:204) ~mybati-3.4.6.jar:3.4.6 at org.apache.ibatis.builder.annotation.ProviderSqlSource.extractProviderMethodArguments(ProviderSqlSource.java:156) -3.4.6.jar:3.4.6 at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:120) -3.4.6.jar:3.4.6 at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:120)org.apache.ibatis.builder.annotation.ProviderSqlSource.getBoundSql(ProviderSqlSource.java:102) ~ org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292) -3.4.6.jar:3.4.6 at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)-3.4.6.jar:3.4.6 at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81) -3.4.6.jar:3.4.6 at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148) ~mybatis-3.4.6.jar:3.4.6 at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141) ~mybatis-3.4.6.jar:3.4.6 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法) ~na:1.8.0_191 at sun.reflect .

这些参数名是什么,param3,param1,电子邮件,用户名,param2]?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-12 22:52:31

出现此问题是因为mybatis无法将参数从mapper方法传递给构建器。

您需要注释构建器中的参数:

代码语言:javascript
运行
复制
public static String buildFindByDynamicFilter(
   final @Param("username") String username,
   final @Param("name") String name,
   final @Param("email") String email) {

或删除未从构建器方法签名中使用的参数(在您的示例中,所有参数都可以删除,因为构建器中没有使用这些参数):

代码语言:javascript
运行
复制
public static String buildFindByDynamicFilter() {
    ...
} 

或者将包括方法参数名称放入编译的类中,并确保构建器方法中的参数与映射器方法中的参数的命名方式相同。

构建查询的Mybatis (如SELECTFROMWHERE等)本身不需要参数。生成器的目的是生成sql查询文本。参数绑定将在稍后发生时发生,当myb提斯从构建器(或@Select注释或xml )检索查询文本并使用JDBC准备语句执行查询时。

[name, param3, param1, email, username, param2]是映射器方法的参数。每个参数都在两个键下可用,第一个是映射方法参数上的@Param注释的值,第二个是以param为前缀的参数的顺序数(索引是基于零的,第一个是跳过的,因为映射方法的第一个参数是隐式this)。Mybatis试图使用可用参数列表显示合理的错误消息,但如果没有方法参数信息可用,则会使人感到困惑。

在构建器中,如果没有@Param注释,则使用反射来获取方法参数。如果方法参数信息不包含在-parameters javac选项中,那么参数名是arg0arg1等等。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53751996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档