2016-07-20 5 views
1

これは正常に機能するリポジトリのクエリです。spring-data-couchbaseでn1qlを使用して文書からフィールドを取り出す方法

public interface PlayerRepo extends CrudRepository<Player, String>{ 

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

私はこのように、プレイヤー文書から特定のフィールドを取得したい:

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

がこれを行うには、それは可能です、私は現在、2.1.2

+0

は、この機能は本当に便利だろう...あなたのリポジトリに関連付けられている正しいバケツでなく、#{#n1ql.bucket}との部分から、その部分(とその部分だけ)を覆っているカバーされていないように思えます可能なatmが含まれて本当にいいですね。 – Abbadon

答えて

0

春・データのCouchbaseを使用していますこれはリポジトリからは不可能です。 Spring Data Hopperはこれを可能にするProjection機能を導入しましたが、Couchbaseストアの実装ではまだそれをカバーしていません。

findByN1QLProjectionメソッドを持つCouchbaseTemplateには近いものがありますが、クエリ専用のDTOが必要です。例えば:

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

findByN1QLProjectionで動作するように以下のクラスを必要とするであろう:

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

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

をそしてそれはList<PersonNameDTO>を生成するには(純粋N1QLで)等価である

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

。これは、具体的なDTOクラスではなく、インタフェースを中心に設計されていることを除いて、私が話していた投影機能と大きく異なるわけではないことに注意してください。

#{#n1ql.selectEntity} SpELを使用しないでください。目的は、特定のエンティティのすべてのフィールドをカバーする大きなSELECT句を持つことです(ここではSELECT句を制限します)。

また、

+0

私によれば、私はCouchbaseを使って、select subDocumentField FROM 'my-bucket'(meta()。id = 'my-id')のようなクエリを実行できます。だから、春のデータcouchbaseがそれをサポートしていないということだけです...もっと実験されたユーザーからの確認は素敵です:)。 – Abbadon

+0

これはSpring Data Ingallsに同梱されているバージョンで可能です。couchbaseコネクタはスプリングデータ投影をサポートします –

関連する問題