1

これは、正常に機能するリポジトリ内のクエリです。

public interface PlayerRepo extends CrudRepository<Player, String>{

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

次のように、Player ドキュメントから特定のフィールドをフェッチしたい:

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

これを行うことは可能ですか、私は spring-data-couchbase 2.1.2 を使用しています

4

1 に答える 1

1

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

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

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

これは (純粋な N1QL で) 以下と同等です。

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>. これは、具体的な DTO クラスではなくインターフェイスを中心に設計されていることを除いて、私が話していたプロジェクション機能と大きく異なるわけではないことに注意してください。

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

また、リポジトリに関連付けられた正しいバケットを含む FROM 部分もカバーしますが、#{#n1ql.bucket}その部分 (およびその部分のみ) もカバーします...

于 2016-07-20T11:06:28.247 に答える