2017-09-20 6 views
0

Ich versuche, eine N1QL-basierte Abfrage auf Spring Data Couchbase zu machen. Die Dokumentation sagtSpring Daten Couchbase # n1ql.fields Abfrage

#n1ql.fields will be replaced by the list of fields (eg. for a SELECT clause) necessary to reconstruct the entity.

Mein Repository Implementierung ist diese:

@Query("#{#n1ql.fields} WHERE #{#n1ql.filter}") 
List<User> findAllByFields(String fields); 

Und ich rufe diese Abfrage wie folgt:

this.userRepository.findAllByFields("SELECT firstName FROM default"); 

ich diesen Fehler:

Caused by: org.springframework.data.couchbase.core.CouchbaseQueryExecutionException: Unable to execute query due to the following n1ql errors: {"msg":"syntax error - at AS","code":3000}

Nach ein wenig von Forschung, ich habe versucht auch:

@Query("SELECT #{#n1ql.fields} FROM #{#n1ql.bucket} WHERE #{#n1ql.filter}") 

Mit dieser Abfrage erhalte ich keinen Fehler, erhalte ich alle Dokumente gespeichert, sondern nur die ID die anderen Felder werden auf Null gesetzt, wenn meine Frage zu bekommen versucht, das firstName-Feld

this.userRepository.findAllByFields("firstName"); 

Wer weiß, wie man so eine Abfrage macht?

Vielen Dank im Voraus.

Antwort

0

Sie missverstehen das Konzept, ich ermutige Sie, der Dokumentation mehr Zeit zu geben und weitere Beispiele zu sehen. Ich bin mir nicht sicher, was genau Sie erreichen wollen, aber ich werde ein paar Beispiele geben.

Suche alle Benutzer (mit all ihren gespeicherten Daten)

@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter}") 
List<User> findAllUsers(); 

Diese erzeugen im Grunde SELECT meta().id,_cas,* FROM bucket WHERE type='com.example.User'

Hinweis findAllUsers() keine Parameter übernehmen, weil es keine param Platzhalter in der @Query definiert sind über.

Suche alle Benutzer, wo vorName wie

@Query("#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND firstName like $1") 
List<User> findByFirstNameLike(String keyword); 

Dies wird so etwas wie die obige Abfrage erzeugen, aber mit einem zusätzlichen, wo Bedingung firstName like

Hinweis diese Methode ein Schlüsselwort nimmt, weil es ein Platzhalter param ist definiert $1.


Hinweis in der Dokumentation sagt, es

#{#n1ql.selectEntity} WHERE #{#n1ql.filter} AND test = $1

is equivalent to

SELECT #{#n1ql.fields} FROM #{#n1ql.bucket} WHERE #{#n1ql.filter} AND test = $1


Nun, wenn Sie nicht alle Daten für Benutzer holen wollen (s), werden Sie die Felder angeben müssen sein ausgewählt, lesen Sie folgenden Links für weitere Informationen

How to fetch a field from document using n1ql with spring-data-couchbase

https://docs.spring.io/spring-data/couchbase/docs/2.2.4.RELEASE/reference/html/#_dto_projections

+0

Die Dokumentation, die Sie gepostet haben, hat mir sehr geholfen. Schließlich habe ich verstanden, dass Spring Data dies nicht unterstützt und die einzige Möglichkeit darin besteht, Projektionen zu verwenden. Vielen Dank. – Elena

Verwandte Themen