1. 概要

これは、SpringDataCassandraの記事シリーズの2番目の記事です。 この記事では、主にデータアクセス層でのCassandraTemplateおよびCQLクエリに焦点を当てます。 Spring Data Cassandraの詳細については、シリーズの最初の記事を参照してください。

Cassandraクエリ言語(CQL)はCassandraデータベースのクエリ言語であり、CqlTemplateはSpringDataCassandraの低レベルのデータアクセステンプレートです。これは、CQLステートメントを実行するためのデータ操作関連の操作を便利に公開します。

CassandraTemplate は、低レベルの CqlTemplate の上に構築され、ドメインオブジェクトをクエリし、オブジェクトをCassandraの永続化されたデータ構造にマップする簡単な方法を提供します。

構成から始めて、2つのテンプレートの使用例を詳しく見ていきましょう。

2. CassandraTemplate構成

CassandraTemplate は、メインのCassandra Spring構成がAbstractCassandraConfigurationを拡張しているため、Springコンテキストで使用できます。

@Configuration
@EnableCassandraRepositories(basePackages = "com.baeldung.spring.data.cassandra.repository")
public class CassandraConfig extends AbstractCassandraConfiguration { ... }

次に、テンプレートを単純にワイヤリングできます。正確なタイプであるCassandraTemplateを使用するか、より一般的なインターフェイス CassandraOperations:として使用します。

@Autowired
private CassandraOperations cassandraTemplate;

3. CassandraTemplateを使用したデータアクセス

データアクセス層モジュールで上記で定義したCassandraTemplateを使用して、永続的なデータを操作してみましょう。

3.1. 新しい本を保存する

新しい本を書店に保存できます。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);

次に、データベースに挿入された本の可用性を確認できます。

Select select = QueryBuilder.select().from("book")
  .where(QueryBuilder.eq("title", "Head First Java"))
  .and(QueryBuilder.eq("publisher", "O'Reilly Media"));
Book retrievedBook = cassandraTemplate.selectOne(select, Book.class);

ここでは、 Select QueryBuilder を使用して、 cassandraTemplateselectOne()にマップしています。 QueryBuilder については、CQLクエリのセクションで詳しく説明します。

3.2. 複数の本を保存する

リストを使用して、一度に複数の本を書店に保存できます。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
Book dPatternBook = new Book(
  UUIDs.timeBased(), "Head Design Patterns", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
List<Book> bookList = new ArrayList<Book>();
bookList.add(javaBook);
bookList.add(dPatternBook);
cassandraTemplate.insert(bookList);

3.3. 既存の本を更新する

新しい本を挿入することから始めましょう。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);

本をフェッチしましょう:

Select select = QueryBuilder.select().from("book");
Book retrievedBook = cassandraTemplate.selectOne(select, Book.class);

次に、取得した本にいくつかのタグを追加しましょう。

retrievedBook.setTags(ImmutableSet.of("Java", "Programming"));
cassandraTemplate.update(retrievedBook);

3.4. 挿入した本を削除する

新しい本を挿入しましょう:

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);

次に、本を削除します。

cassandraTemplate.delete(javaBook);

3.5. すべての本を削除する

ここで、いくつかの新しい本を挿入しましょう。

Book javaBook = new Book(
  UUIDs.timeBased(), "Head First Java", "O'Reilly Media",
  ImmutableSet.of("Computer", "Software"));
Book dPatternBook = new Book(
  UUIDs.timeBased(), "Head Design Patterns", "O'Reilly Media", 
  ImmutableSet.of("Computer", "Software"));
cassandraTemplate.insert(javaBook);
cassandraTemplate.insert(dPatternBook);

次に、すべての本を削除します。

cassandraTemplate.deleteAll(Book.class);

4. CQLクエリを使用したデータアクセス

データアクセス層でのデータ操作にCQLクエリを使用することは常に可能です。 CQLクエリの処理は、 CqlTemplate クラスによって実行されるため、必要に応じてカスタムクエリを実行できます。

ただし、CassandraTemplateクラスはCqlTemplateの拡張であるため、これらのクエリを直接実行するために使用できます。

CQLクエリを使用してデータを操作するために使用できるさまざまな方法を見てみましょう。

4.1. QueryBuilderを使用する

QueryBuilder を使用して、データベース内のデータ操作用のクエリを作成できます。 ほとんどすべての標準操作は、すぐに使用できるビルディングブロックを使用して構築できます。

Insert insertQueryBuider = QueryBuilder.insertInto("book")
 .value("isbn", UUIDs.timeBased())
 .value("title", "Head First Java")
 .value("publisher", "OReilly Media")
 .value("tags", ImmutableSet.of("Software"));
cassandraTemplate.execute(insertQueryBuider);

コードスニペットをよく見ると、関連する操作タイプ(挿入、削除など)の代わりに execute()メソッドが使用されていることに気付くかもしれません。 これは、クエリのタイプがQueryBuilder。の出力によって定義されるためです。

4.2. PreparedStatementsの使用

PreparedStatements はどのような場合でも使用できますが、このメカニズムは通常、高速取り込み用の複数の挿入に推奨されます。

A PreparedStatement は1回だけ準備され、高性能を確保するのに役立ちます。

UUID uuid = UUIDs.timeBased();
String insertPreparedCql = 
  "insert into book (isbn, title, publisher, tags) values (?, ?, ?, ?)";
List<Object> singleBookArgsList = new ArrayList<>();
List<List<?>> bookList = new ArrayList<>();
singleBookArgsList.add(uuid);
singleBookArgsList.add("Head First Java");
singleBookArgsList.add("OReilly Media");
singleBookArgsList.add(ImmutableSet.of("Software"));
bookList.add(singleBookArgsList);
cassandraTemplate.ingest(insertPreparedCql, bookList);

4.3. CQLステートメントの使用

次のように、CQLステートメントを直接使用してデータをクエリできます。

UUID uuid = UUIDs.timeBased();
String insertCql = "insert into book (isbn, title, publisher, tags) 
  values (" + uuid + ", 'Head First Java', 'OReilly Media', {'Software'})";
cassandraTemplate.execute(insertCql);

5. 結論

この記事では、 CassandraTemplate やCQLクエリなど、SpringDataCassandraを使用したさまざまなデータ操作戦略について説明しました。

上記のコードスニペットと例の実装は、 my GitHubプロジェクトにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。