【发布时间】:2017-04-27 06:46:05
【问题描述】:
我想检查集合中是否已经存在具有 15 个相等字段的文档。而且@Query注解似乎不能处理超过10个参数。以下类在调用重复时抛出异常。
public interface ReportingentriesRepository extends MongoRepository<Reportingentries, String> {
@Query(exists = true,value = "{ 'foo': ?0,'foo1': ?1,'foo2': ?2,'foo3': ?3,'foo4': ?4,'foo5': ?5,'foo6': ?6,'foo7': ?7,'foo8': ?8,'foo9': ?9, 'foo10': ?10}")
boolean isDuplicated(String value0, String value1, String value2, String value3, String value4, String value5, String value6, String value7, String value8, String value9, String value10);
}
例外是:
java.util.NoSuchElementException: Could not to find binding for placeholder '?11'.
at org.springframework.data.mongodb.repository.query.ExpressionEvaluatingParameterBinder$BindingContext.getBindingFor(ExpressionEvaluatingParameterBinder.java:341) ~[spring-data-mongodb-1.10.0.RELEASE.jar:?]
at org.springframework.data.mongodb.repository.query.ExpressionEvaluatingParameterBinder.replacePlaceholders(ExpressionEvaluatingParameterBinder.java:120) ~[spring-data-mongodb-1.10.0.RELEASE.jar:?]
at org.springframework.data.mongodb.repository.query.ExpressionEvaluatingParameterBinder.bind(ExpressionEvaluatingParameterBinder.java:91) ~[spring-data-mongodb-1.10.0.RELEASE.jar:?]
at org.springframework.data.mongodb.repository.query.StringBasedMongoQuery.createQuery(StringBasedMongoQuery.java:130) ~[spring-data-mongodb-1.10.0.RELEASE.jar:?]
at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:84) ~[spring-data-mongodb-1.10.0.RELEASE.jar:?]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:483) ~[spring-data-commons-1.13.0.RELEASE.jar:?]
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461) ~[spring-data-commons-1.13.0.RELEASE.jar:?]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61) ~[spring-data-commons-1.13.0.RELEASE.jar:?]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) ~[spring-aop-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57) ~[spring-data-commons-1.13.0.RELEASE.jar:?]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) ~[spring-aop-4.3.6.RELEASE.jar:4.3.6.RELEASE]
at com.sun.proxy.$Proxy94.isDuplicated(Unknown Source) ~[?:?]
at com.company.importer.Application.run(Application.java:29) [classes/:?]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:776) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:760) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:747) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.1.RELEASE.jar:1.5.1.RELEASE]
at com.company.importer.Application.main(Application.java:22) [classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_92]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_92]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_92]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_92]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-1.5.1.RELEASE.jar:1.5.1.RELEASE]
是我遗漏了什么还是 spring 根本不支持这个?
我正在使用 spring-boot-starter-data-mongodb:1.5.1.RELEASE
【问题讨论】:
-
我不认为这是因为查询参数的数量。查询语法应该有问题。 @Query 可以处理超过 10 个参数
-
做我的客人,告诉我在哪里...我没有胶水。这是我可以用 11 个参数成像的最简单的查询,但它失败了。
-
从错误消息看来您正在使用占位符 '?11' 。在 ExpressionEvaluatingParameterBinder::getBindingFor 方法中放置一个断点并查看传递了哪些值。我无法重现这一点。对我来说,即使有 15 个参数,它也能正常工作
-
看起来像一个错误。想在jira.spring.io/browse/DATAMONGO 提交票证吗?
标签: java spring mongodb spring-data