问题描述
我正在使用 spring-data-couchbase ,但是从方法名称创建查询不起作用.以下是我的代码:
I am using spring-data-couchbase , but the Query creation from method names is not work. following is my code:
spring-couchbase.xml
spring-couchbase.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/data/jpa"
xmlns:couchbase="http://www.springframework.org/schema/data/couchbase"
xmlns:jpa="http://www.springframework.org/schema/data/couchbase"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/data/couchbase
http://www.springframework.org/schema/data/couchbase/spring-couchbase.xsd">
<couchbase:couchbase bucket="comment" host="192.168.20.118,192.168.20.71" />
<couchbase:template/>
<jpa:repositories base-package="com.david.comment.core.repository" />
</beans:beans>
存储库:
public interface CommentRepository extends PagingAndSortingRepository<CommentDoc, String> {
public Page<CommentDoc> findByUserId(String userId, Pageable pageable);
}
域:
@Document
@Data
public class CommentDoc {
@Id
private String id;
/**
* 话题
*/
@Field
private String topicId;
/**
* 用户ID
*/
@Field
private String userId;
}
测试:
@Test
public void testFindByC1() {
Pageable pageable = new PageRequest(0, 10);
Page<CommentDoc> comments = commentRepository.findByUserId("user01", pageable);
for(CommentDoc commentDoc : comments) {
logger.debug("doc: {}", commentDoc);
}
}
例外:
java.lang.IllegalStateException: Unknown query param: user01
at org.springframework.data.couchbase.repository.query.ViewBasedCouchbaseQuery.execute(ViewBasedCouchbaseQuery.java:47)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:393)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:371)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.couchbase.repository.support.ViewPostProcessor$ViewInterceptor.invoke(ViewPostProcessor.java:87)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy24.findByUserId(Unknown Source)
at com.runmit.comment.core.test.CommentRepositoryTest.testFindByC1(CommentRepositoryTest.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:82)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:73)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:217)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
请有人帮助我!我该如何解决它.
Please someone help me! How can I resolve it.
推荐答案
我是新手,但刚刚经历过.Couchbase 的东西似乎不支持其他 Spring Data 存储库中提供的所有内容.
I'm new to this, but just went through it. The Couchbase stuff doesn't seem to support everything offered in the other Spring Data repositories.
您必须添加一个名为 commentdoc/byUserId 的生产视图(在开发视图中,设计文档名称 = commentdoc 和 viewname = byUserId).不要忘记发布.类似(修复类名):
You have to add a production view called commentdoc/byUserId (in development view design document name = commentdoc and viewname = byUserId). Don't forget to publish. Something like (fix classname):
function (doc, meta) {
if(doc._class == "com.david.XXX.CommentDoc" && doc.userId){
emit(doc.userID, null);
}
}
将您的 repo 签名从 String userId 更改为 Query userId
Change your repo signature from String userId to Query userId
传递一个查询对象.类似的东西:
Pass a Query object. Something like:
Query query = new Query();
query.setKey(ComplexKey.of("useridofinteres="));
commentRepository.findByUserId(query, pageable);
这篇关于我正在使用 spring-data-couchbase ,但是从方法名称创建查询不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!