2016-05-26 3 views
0

Ich möchte alle Dokumente abzurufen, die auf Listensammlung basierend existiere ich habe mit Feder-data-CouchbaseReturn Couchbase Dokumente von Schlüsseln

Derzeit bin ich mit

public interface PushRepository extends CrudRepository<Push,String> 

und Funktion pushRepository.findAll(phoneNumbers) aber ich denke, es ruft alle von ihnen ab und macht dann die Filterung.

Wie kann ich eine N1QL Abfrage ausführen, so dass nur ich Dokumente auf Tasten abrufen

@Query("#{#n1ql.selectEntity} WHERE role = 'admin' AND #{#n1ql.filter}") 
Collection<Push> findByIds(); 

Die Abfrage i ausgeführt werden soll ist die unter

select * from activation use keys ["xxxxx","yyyyy"]; 

Antwort

0

Die findAll(Iterable) eine darunter liegende Ansicht verwendet (was soll nur die Dokumente indexieren, die Ihrer Entität Push entsprechen), aber es stellt fest, welche Ansichtsschlüssel einzuschränken sind, also sollte es schon ziemlich effizient sein.

Wenn Sie eine N1QL-Abfrage ausführen möchten, die direkt Dokumentschlüssel verwendet, ist dies mit @Query sicher noch möglich. Da Sie Schlüssel direkt verwenden, ist keine WHERE-Klausel erforderlich (Sie wissen, dass die Schlüssel Push Dokumente entsprechen). So können Sie einfach eine Inline-Abfrage wie folgt tun:

@Query("#{#n1ql.selectEntity} USE KEYS [\"xxxxx\", \"yyyyy\"]") 
Collection<Push> myCustomFind(); 

Wenn Sie die Liste der Schlüssel dynamisch zu konstruieren, man müsste die korrekte Syntax nachschlagen, aber ich wette, das ist machbar Spel verwenden. Beispielsweise können zwei Schlüssel aus den Methodenparametern in der Abfrageunterschrift wie folgt ausgeführt werden:

@Query("#{#n1ql.selectEntity} USE KEYS [\"#{[0]}\", \"#{[1]}\"]") 
Collections<Push> findTwoByN1qlKey(String key1, String key2);