1

N1QL クエリを使用して spring-data カウチベース リポジトリにクエリを実行しようとしています。私には2つの疑問があります:

@Query アノテーションを使用してクエリを生成しています。コードは次のようになります。

@Query("#{#n1ql.selectEntity} WHERE $0 = $1 AND #{#n1ql.filter}")
    public Page<GsJsonStore> matchJson(String term, String value, Pageable pageable);
    //Query
    Page<GsJsonStore> p = repo.matchJson("_object.details.status", "ready", pg);

このクエリは結果を返しません。ただし、cbq で同じクエリ (以下) を実行すると、目的の結果が得られます。

select * from default where _object.details.status = 'ready';

Couchbase リポジトリによって生成されたクエリ文字列を表示するにはどうすればよいですか? スプリングブーツを使用しています。このユースケースで @Query アノテーションを使用するのは正しいですか?

CouchbaseOperationsまた、テンプレートで n1QL クエリを実行するにはどうすればよいですか? メソッドがあることは知って findByN1QLいますが、それに関する適切なドキュメントは見つかりませんでした。誰かがこれを使用する方法を説明してもらえますか?

4

1 に答える 1

2

クエリは問題ないようです。Spring Data Couchbase リポジトリを使用してエンティティを永続GsJsonStore化しましたか?

フレームワークによって生成および実行されたすべてのクエリ (あなたの場合のようなインラインクエリを含む) をログに記録するために、構成で次のようにロガーを構成できlogback.xmlます。

<logger name="org.springframework.data.couchbase.repository.query" level="debug"/>

少なくとも WHERE 句を使用していないため、実行されたクエリと cbq で実行したクエリは同じではないことがわかります。

N1QLCouchbaseOperationsクエリに関連する 2 つのメソッドがあります。

  1. findByN1QL: これは、Spring Data アノテーション付きエンティティの逆シリアル化を修正するために必要なすべてのデータが選択されていることを確認するために、クエリの特定の構造を想定しています (これが#n1ql.selectEntityおよび#n1ql.filterSpEL の目的です)。
  2. findByN1QLProjectionより自由な形式です。ジャクソンが提供されたクエリの結果を要求されたクラスに逆シリアル化できる場合、それは可能です。そのため、このメソッドでは SELECT 句が暗黙的に制限されることはほとんどありません。

両方を使用するにはN1qlQuery、SDK からオブジェクトを渡す必要があります。N1qlQueryこのようなクエリは、クラスのファクトリ メソッドを使用して構築できます。次に例を示します。

//a version of the query that is constructed from positional parameters
N1qlQuery queryWithParameter = N1qlQuery.parameterized("SELECT name FROM `beer-sample` WHERE name LIKE $0", JsonArray.from("%dog%"));

//let Spring Data execute the query, projecting to the String class
List<String> beerNamesContainingDog = template.findByN1QLProjection(queryWithParameter, String.class);
于 2016-03-14T13:29:07.933 に答える