我正在用MyBatis在Spring中做一些测试,我决定测试两种使用注释进行sql查询的方法,但是其中一种方法不起作用,我想要一些帮助来理解这个问题。
起作用了:
@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);类SqlBuilder
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的方式还需要其他什么吗?
发布于 2018-12-12 22:52:31
出现此问题是因为mybatis无法将参数从mapper方法传递给构建器。
您需要注释构建器中的参数:
public static String buildFindByDynamicFilter(
final @Param("username") String username,
final @Param("name") String name,
final @Param("email") String email) {或删除未从构建器方法签名中使用的参数(在您的示例中,所有参数都可以删除,因为构建器中没有使用这些参数):
public static String buildFindByDynamicFilter() {
...
} 或者将包括方法参数名称放入编译的类中,并确保构建器方法中的参数与映射器方法中的参数的命名方式相同。
构建查询的Mybatis (如SELECT、FROM、WHERE等)本身不需要参数。生成器的目的是生成sql查询文本。参数绑定将在稍后发生时发生,当myb提斯从构建器(或@Select注释或xml )检索查询文本并使用JDBC准备语句执行查询时。
[name, param3, param1, email, username, param2]是映射器方法的参数。每个参数都在两个键下可用,第一个是映射方法参数上的@Param注释的值,第二个是以param为前缀的参数的顺序数(索引是基于零的,第一个是跳过的,因为映射方法的第一个参数是隐式this)。Mybatis试图使用可用参数列表显示合理的错误消息,但如果没有方法参数信息可用,则会使人感到困惑。
在构建器中,如果没有@Param注释,则使用反射来获取方法参数。如果方法参数信息不包含在-parameters javac选项中,那么参数名是arg0、arg1等等。
https://stackoverflow.com/questions/53751996
复制相似问题