存储库使用N1QL

时间:2015-12-15 15:25:05

标签: couchbase spring-data-couchbase

我收到以下异常:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'answerRepository': Invocation of init method failed; nested exception is org.springframework.data.couchbase.core.UnsupportedCouchbaseFeatureException: Repository uses N1QL

我使用Spring 4.2.0.RELEASE与spring-data-couchbase 2.0.0.M1对抗Couchbase 2.5.1企业版(build-1083)

我无法在文档中看到此错误的任何解释。

这是存储库:

public interface AnswerRepository extends BaseRepository<Answer, String> {

  final static String DESIGN_DOCUMENT = "answers";

  @View(viewName = "answers_by_quizId_startTime", designDocument = DESIGN_DOCUMENT)
  public List<Answer> findByQuizIdAndStartTime(String quizId, long startTime);

  Answer findByUuid(String uuid);

}

@NoRepositoryBean
public interface BaseRepository<T, ID extends Serializable> extends CrudRepository<T, ID>  {
}

也许我的Couchbase服务器不支持此功能,而我的存储库需要它。

我可能需要以不同的方式编写我的存储库代码。

它太糟糕了,它没有说明哪种方法是无效的。

或者是我在基类中使用CrudRepository?

我想知道如何找出它希望在我的Couchbase服务器中找到哪些视图。

1 个答案:

答案 0 :(得分:2)

Spring Data Couchbase 2.0中的存储库几乎完全依赖于ViewsN1QL。 N1QL使这个版本中的很多新功能成为可能,N1QL现在是Spring Data用于&#34;查询派生&#34;等内容的默认机制。 (通过生成从方法名称派生的某种查询来实现存储库方法)。

Couchbase Server 2.5.1无法访问N1QL (Couchbase Server 4.0 附带,当然也有全新的4.1版本)。

如果您希望Spring Data为您实施findByUuid,则必须使用@View为该方法添加注释,并创建从Answer文档中发出uuids的相应视图

查看查询派生受到严格限制并为您提供更多工作,因为您必须编写正确的map function

  • 基于视图的存储库方法只能使用一个条件查询
  • 您必须正确创建视图,并根据您要查询的条件发出正确的密钥。
  • 您必须为每个实体类创建一个视图,将视图限制为仅在&#34; _class&#34; JSON中的字段与所述实体匹配(注意:此字段可以在配置中重命名,因此请确保使用相关的字段)。

这意味着您的findByQuizIdAndStartTime无法正常工作。您可能必须在findByUuid中实施此操作(可能BaseRepository),依赖CouchbaseTemplate并使用其findByView方法(甚至queryView作为不得已)。

M1文档第7章(N1QL based querying)中提到了UnsupportedCouchbaseFeatureException

另请参阅文档中的view query derivation部分。