【问题标题】:Spring JPA & Couchbase - com.couchbase.client.java.error.ViewDoesNotExistException: View cat/all does not existSpring JPA & Couchbase - com.couchbase.client.java.error.ViewDoesNotExistException:查看猫/全部不存在
【发布时间】:2020-01-02 15:12:11
【问题描述】:

我的Spring boot 应用正在尝试从Couchbasebucket 中获取Cat 类型的所有文档。

有一个索引:

CREATE INDEX cats_idx ON `cats`(_class) WHERE _class = 'com.example.Cat'

还有一个Repository 类:

public interface CatRepository extends CouchbaseRepository<Cat, String>

当从代码中调用它时

Iterable<Cat> all = catRepository.findAll();

我得到了这个例外:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request 
processing failed; nested exception is 
org.springframework.dao.InvalidDataAccessResourceUsageException: View cat/all does not exist.; 
nested exception is com.couchbase.client.java.error.ViewDoesNotExistException: View cat/all does not 
exist.] with root cause 
rx.exceptions.OnErrorThrowable$OnNextValue: OnError while emitting onNext value: com.couchbase.client.java.document.json.JsonObject.class
at rx.exceptions.OnErrorThrowable.addValueAsLastCause(OnErrorThrowable.java:118)
at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:73)
at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:77)
at rx.internal.producers.SingleProducer.request(SingleProducer.java:65)
at rx.Subscriber.setProducer(Subscriber.java:211)
at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102)
at rx.internal.operators.OperatorSingle$ParentSubscriber.onCompleted(OperatorSingle.java:113)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:281)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:216)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266)
at java.util.concurrent.FutureTask.run(FutureTask.java)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

【问题讨论】:

    标签: java jpa couchbase spring-data-couchbase


    【解决方案1】:

    Spring Data SDK 的当前实现仍然在内部为 findAll 和 removeAll 等方法使用视图(在 SDK 版本 3.0 上不再使用视图)。因此,您可以为此文档类型创建一个视图,也可以自己实现一个新的 findAll 方法:

    @Query("#{#n1ql.selectEntity} where #{#n1ql.filter} ")
    List<Cat> all();
    

    该方法应该使用你的cats_idx

    PS:cats_idx 不是最优的,你不应该在索引中存储 _class 属性。

    【讨论】:

    • 您能否详细说明索引的问题?
    • 在索引中存储 _class 意味着您将基本上拥有相同的字符串“com.example.Cat”几百万次(假设您有几百万只猫)。您的索引应该按 _class 过滤,但存储更多有用的属性:create cats_idx ON cats(age, name, race) where _class= 'com.example.Cat' 。我在这里写了这个教程docs.couchbase.com/tutorials/spring-data-indexes/…
    • 您好,我遇到了与问题中提到的相同的错误。我通过使用查询注释尝试了解决方案,但再次遇到相同的错误。我怀疑我没有正确实施解决方案。我正在做以下事情,如果我错过了什么,请纠正我。 @RequestMapping (value = "/all", method = RequestMethod.GET) @Query("select * from bucketname") public Iterable getAllCats() { Iterable all = catRepository.findAll();全部归还; }
    【解决方案2】:

    我在使用沙发底座时也遇到了同样的问题,如果有一个 .findAll() 方法正在执行。所以我在repository类中给出了如下注解。

    @N1qlPrimaryIndexed
    @ViewIndexed(designDoc = "product",viewName = "all")
    public interface ProductRepository extends CouchbaseRepository<Product,Integer> {
    }
    

    上述方法对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 2014-09-06
      • 1970-01-01
      • 2021-03-15
      • 2016-08-26
      • 1970-01-01
      相关资源
      最近更新 更多