2016-07-20 5 views
1

Dies ist die Abfrage im Repository, die gut funktioniert.So holen Sie ein Feld aus einem Dokument mit n1ql mit spring-data-couchbase

public interface PlayerRepo extends CrudRepository<Player, String>{ 

@Query("#{#n1ql.selectEntity} WHERE code = $1 and #{#n1ql.filter}") 
public List<Player> findPlayersWithCode(String code); 
} 

Ich möchte spezifischen Bereich von Spieler Dokument holen, wie folgt aus:

@Query("#{#n1ql.selectEntity.name} WHERE code = $1 and #{#n1ql.filter}") 
public List<String> findPlayerNamesWithCode(String code); 

Ist es möglich, dies zu tun, ich bin mit Feder-data-Couchbase 2.1.2

+0

Diese Funktion wirklich nützlich wäre, scheint, wie es nicht ist möglich atm aber wäre wirklich nett zu umfassen. – Abbadon

Antwort

0

Aktuell Dies ist aus einem Repository nicht möglich. Spring Data Hopper hat eine Projection-Funktion eingeführt, die dies zulässt, aber die Implementierung des Couchbase-Speichers deckt sie noch nicht ab.

Es gibt etwas in der Nähe CouchbaseTemplate, die eine findByN1QLProjection-Methode hat, aber es braucht ein DTO für die Abfrage gewidmet. Zum Beispiel:

SELECT name, lastName FROM #{#n1ql.bucket} WHERE code = $1 AND #{#n1ql.filter} 

, die (in reinen N1QL) äquivalent zu:

SELECT name, lastName FROM bucketThatBacksRepository WHERE code = $1 AND _class = "com.example.Person" 

die folgende Klasse erfordern mit findByN1QLProjection zu arbeiten:

public class PersonNameDTO { 
    private final String name; 
    private final String lastName; 

    //constructor and maybe getters/setters needed but omitted here 
} 

Und es wäre ein List<PersonNameDTO> produzieren . Beachten Sie, dass sich dies nicht wesentlich von der Projektionsfunktion unterscheidet, über die ich gesprochen habe, abgesehen davon, dass es sich eher um Schnittstellen als um konkrete DTO-Klassen handelt.

Beachten Sie, dass Sie den #{#n1ql.selectEntity} SpEL nicht verwenden sollten, da sein Zweck eine große SELECT-Klausel ist, die alle Felder einer gegebenen Entität abdeckt (während Sie hier die SELECT-Klausel einschränken möchten).

Es umfasst auch die FROM-Teil mit dem richtigen Eimer zu Ihrem Repository verbunden ist, aber die #{#n1ql.bucket} auch, dass ein Teil abdeckt (und diesen Teil nur) ...

+0

Laut mir ist es möglich, Couchbase zu verwenden, ich kann Abfragen ausführen wie subDocumentField FROM 'my-bucket' wo meta(). Id = 'my-id'. Es ist also nur so, dass die Daten couchbase es nicht unterstützt ... Eine Bestätigung von einem mehr experimentierten Benutzer wäre nett :). – Abbadon

+0

Dies wird in der mit Spring Data Ingalls gelieferten Version möglich sein, der couchbase-Anschluss unterstützt dann die Federdatenprojektionen –

Verwandte Themen