本文介绍了我正在使用 spring-data-couchbase ,但是从方法名称创建查询不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 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.

  1. 您必须添加一个名为 commentdoc/byUserId 的生产视图(在开发视图中,设计文档名称 = commentdoc 和 viewname = byUserId).不要忘记发布.类似(修复类名):

  1. 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 ,但是从方法名称创建查询不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

  • 07-23 01:01
    查看更多