1概要


以前

、Apache Cayenneを始める方法に焦点を当てました。

この記事では、ORMを使用して単純で高度なクエリを作成する方法について説明します。


2セットアップ

設定は前の記事で使用したものと似ています。

さらに、各テストの前に、3人の作者を保存し、最後にそれらを削除します。

  • ポールザビエル

  • ポールスミス

  • ヴィッキーサラ


3

ObjectSelect


簡単に始めましょう、そして、「Paul」を含む名前を持つすべての作者を取得する方法を見てみましょう。

@Test
public void whenContainsObjS__thenWeGetOneRecord() {
    List<Author> authors = ObjectSelect.query(Author.class)
      .where(Author.NAME.contains("Paul"))
      .select(context);

    assertEquals(authors.size(), 1);
}

次に、著者の名前列に大文字と小文字を区別しないLIKEタイプのクエリを適用する方法を見てみましょう。

@Test
void whenLikeObjS__thenWeGetTwoAuthors() {
    List<Author> authors = ObjectSelect.query(Author.class)
      .where(Author.NAME.likeIgnoreCase("Paul%"))
      .select(context);

    assertEquals(authors.size(), 2);
}

次に、

endsWith()

式は、1人の作成者だけが一致する名前を持つので、1つのレコードのみを返します。

@Test
void whenEndsWithObjS__thenWeGetOrderedAuthors() {
    List<Author> authors = ObjectSelect.query(Author.class)
      .where(Author.NAME.endsWith("Sarra"))
      .select(context);
    Author firstAuthor = authors.get(0);

    assertEquals(authors.size(), 1);
    assertEquals(firstAuthor.getName(), "Vicky Sarra");
}

もっと複雑なのは、名前がリストに含まれている著者に問い合わせることです。

@Test
void whenInObjS__thenWeGetAuthors() {
    List names = Arrays.asList(
      "Paul Xavier", "pAuL Smith", "Vicky Sarra");

    List<Author> authors = ObjectSelect.query(Author.class)
      .where(Author.NAME.in(names))
      .select(context);

    assertEquals(authors.size(), 3);
}


nin

は正反対です。ここでは結果に「Vicky」だけが表示されます。

@Test
void whenNinObjS__thenWeGetAuthors() {
    List names = Arrays.asList(
      "Paul Xavier", "pAuL Smith");
    List<Author> authors = ObjectSelect.query(Author.class)
      .where(Author.NAME.nin(names))
      .select(context);
    Author author = authors.get(0);

    assertEquals(authors.size(), 1);
    assertEquals(author.getName(), "Vicky Sarra");
}

次の2つのコードは、どちらも同じパラメーターを使用して同じタイプの式を作成するため、同じものです。

Expression qualifier = ExpressionFactory
  .containsIgnoreCaseExp(Author.NAME.getName(), "Paul");

Author.NAME.containsIgnoreCase("Paul");

これは、

httpsで使用可能な式のリストです。/docs/4.0/api/org/apache/cayenne/exp/ExpressionFactory.html[

ExpressionFactory

]クラス


:

__


  • likeExp

    :LIKE式を構築するためのもの


  • likeIgnoreCaseExp

    :LIKE

    IGNORE

    CASE式を構築するために使用されます


  • containsExp

    :パターン付きのLIKEクエリの式

文字列のどこかにマッチする
**

containsIgnoreCaseExp

:

containsExp

と同じですが、

大文字と小文字を区別しないアプローチ
**

startsWithExp

:パターンは文字列の先頭と一致する必要があります


  • startsWithIgnoreCaseExp

    :

    startsWithExp

    と似ていますが、

大文字と小文字を区別しないアプローチ
**

endsWithExp

:文字列の末尾に一致する式


  • endsWithIgnoreCaseExp

    :の終わりに一致する式

大文字と小文字を区別しないアプローチを使用した文字列
**

expTrue

:ブール値の

true

式の場合


  • expFalse

    :ブール値の

    false


  • andExp

    :

    and

    演算子を使って2つの式を連鎖するために使用されます


  • orExp

    :

    or

    演算子を使って2つの式を連鎖させる

もっと書かれたテストが記事のコードソースで利用可能です、https://github.com/eugenp/tutorials/tree/master/persistence-modules/apache-cayenne[Github]リポジトリをチェックしてください。


4

SelectQuery


ユーザーアプリケーションで最も広く使用されているクエリタイプです。

SelectQuery

は、SQL構文のように振る舞うシンプルで強力なAPIですが、それでもJavaオブジェクトとメソッドの後に、さらに複雑な式を構築するためのビルダーパターンが続きます。

ここでは、ORMによって次にネイティブSQLに変換される

Expression

(式を構築するための)別名修飾子と

Ordering

(結果をソートするための)クラスの両方を使用してクエリを構築する式言語について説明します。

これを実際に実行するために、いくつかのテストをまとめて、実際に表現とデータの並べ替えの仕方を示します。

“Paul”のような名前の著者を取得するためにLIKEクエリを適用しましょう

@Test
void whenLikeSltQry__thenWeGetOneAuthor() {
    Expression qualifier
      = ExpressionFactory.likeExp(Author.NAME.getName(), "Paul%");
    SelectQuery query
      = new SelectQuery(Author.class, qualifier);

    List<Author> authorsTwo = context.performQuery(query);

    assertEquals(authorsTwo.size(), 1);
}

つまり、クエリに式を指定しないと(

SelectQuery

)、結果はAuthorテーブルのすべてのレコードになります。


containsIgnoreCaseExp

式を使用して同様のクエリを実行すると、大文字と小文字が区別されずにPaulを含む名前のすべての作者を取得できます。

@Test
void whenCtnsIgnorCaseSltQry__thenWeGetTwoAuthors() {
    Expression qualifier = ExpressionFactory
      .containsIgnoreCaseExp(Author.NAME.getName(), "Paul");
    SelectQuery query
      = new SelectQuery(Author.class, qualifier);

    List<Author> authors = context.performQuery(query);

    assertEquals(authors.size(), 2);
}

同様に、大文字と小文字を区別しない方法で「Paul」を含む名前(

containsIgnoreCaseExp

)と、文字hで終わる名前(

endsWithExp

)を使って作成者を取得しましょう。

@Test
void whenCtnsIgnorCaseEndsWSltQry__thenWeGetTwoAuthors() {
    Expression qualifier = ExpressionFactory
      .containsIgnoreCaseExp(Author.NAME.getName(), "Paul")
      .andExp(ExpressionFactory
        .endsWithExp(Author.NAME.getName(), "h"));
    SelectQuery query = new SelectQuery(
      Author.class, qualifier);
    List<Author> authors = context.performQuery(query);

    Author author = authors.get(0);

    assertEquals(authors.size(), 1);
    assertEquals(author.getName(), "pAuL Smith");
}

昇順は、

Ordering

クラスを使用して実行できます。

@Test
void whenAscOrdering__thenWeGetOrderedAuthors() {
    SelectQuery query = new SelectQuery(Author.class);
    query.addOrdering(Author.NAME.asc());

    List<Author> authors = query.select(context);
    Author firstAuthor = authors.get(0);

    assertEquals(authors.size(), 3);
    assertEquals(firstAuthor.getName(), "Paul Xavier");
}


query.addOrdering(Author.NAME.asc())を使用する代わりに、

SortOrder__クラスを使用して昇順にすることもできます。

query.addOrdering(Author.NAME.getName(), SortOrder.ASCENDING);

比較的降順になっています。

@Test
void whenDescOrderingSltQry__thenWeGetOrderedAuthors() {
    SelectQuery query = new SelectQuery(Author.class);
    query.addOrdering(Author.NAME.desc());

    List<Author> authors = query.select(context);
    Author firstAuthor = authors.get(0);

    assertEquals(authors.size(), 3);
    assertEquals(firstAuthor.getName(), "pAuL Smith");
}

前の例で見たように、この順番を設定するもう一つの方法は:

query.addOrdering(Author.NAME.getName(), SortOrder.DESCENDING);


5

SQLTemplate



SQLTemplate

は、オブジェクトスタイルのクエリを使用しないためにCayenneで使用できるもう1つの選択肢です。


SQLTemplate

を使用してクエリを構築することは、いくつかのパラメータを使用してネイティブSQLステートメントを記述することと直接相対的です。簡単な例をいくつか実装しましょう。

各テストの後に著者をすべて削除する方法は次のとおりです。

@After
void deleteAllAuthors() {
    SQLTemplate deleteAuthors = new SQLTemplate(
      Author.class, "delete from author");
    context.performGenericQuery(deleteAuthors);
}

記録されたすべての著者を見つけるには、SQLクエリ

selectを適用する必要があります。
** Author

から。結果が正しいことが直接わかります。

ちょうど3人の保存された作者がいます:

@Test
void givenAuthors__whenFindAllSQLTmplt__thenWeGetThreeAuthors() {
    SQLTemplate select = new SQLTemplate(
      Author.class, "select **  from Author");
    List<Author> authors = context.performQuery(select);

    assertEquals(authors.size(), 3);
}

次に、作者に「Vicky Sarra」という名前を付けます。

@Test
void givenAuthors__whenFindByNameSQLTmplt__thenWeGetOneAuthor() {
    SQLTemplate select = new SQLTemplate(
      Author.class, "select **  from Author where name = 'Vicky Sarra'");
    List<Author> authors = context.performQuery(select);
    Author author = authors.get(0);

    assertEquals(authors.size(), 1);
    assertEquals(author.getName(), "Vicky Sarra");
}


6.

EJBQLQuery


次に、CayenneでJava Persistence APIを採用するための実験の一部として作成された__EJBQLQueryを通じてデータを照会しましょう。

ここでは、クエリはパラメータ化されたオブジェクトスタイルで適用されます。実際の例を見てみましょう。

まず、すべての保存された著者の検索はこのようになります。

@Test
void givenAuthors__whenFindAllEJBQL__thenWeGetThreeAuthors() {
    EJBQLQuery query = new EJBQLQuery("select a FROM Author a");
    List<Author> authors = context.performQuery(query);

    assertEquals(authors.size(), 3);
}

もう一度「Vicky Sarra」という名前で著者を検索しましょう。

@Test
void givenAuthors__whenFindByNameEJBQL__thenWeGetOneAuthor() {
    EJBQLQuery query = new EJBQLQuery(
      "select a FROM Author a WHERE a.name = 'Vicky Sarra'");
    List<Author> authors = context.performQuery(query);
    Author author = authors.get(0);

    assertEquals(authors.size(), 1);
    assertEquals(author.getName(), "Vicky Sarra");
}

さらに良い例は作者の更新です。

@Test
void whenUpdadingByNameEJBQL__thenWeGetTheUpdatedAuthor() {
    EJBQLQuery query = new EJBQLQuery(
      "UPDATE Author AS a SET a.name "
      + "= 'Vicky Edison' WHERE a.name = 'Vicky Sarra'");
    QueryResponse queryResponse = context.performGenericQuery(query);

    EJBQLQuery queryUpdatedAuthor = new EJBQLQuery(
      "select a FROM Author a WHERE a.name = 'Vicky Edison'");
    List<Author> authors = context.performQuery(queryUpdatedAuthor);
    Author author = authors.get(0);

    assertNotNull(author);
}

単に列を選択したい場合は、次のクエリを使用する必要があります。より多くの例はhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/apache-cayenne[Github]の記事のソースコードで利用可能です。


7.

SQLExec



SQLExec

もCayenneのバージョンM4から導入された新しい流暢なクエリAPIです。

単純な挿入は次のようになります。

@Test
void whenInsertingSQLExec__thenWeGetNewAuthor() {
    int inserted = SQLExec
      .query("INSERT INTO Author (name) VALUES ('Baeldung')")
      .update(context);

    assertEquals(inserted, 1);
}

次に、著者の名前に基づいて著者を更新します。

@Test
void whenUpdatingSQLExec__thenItsUpdated() {
    int updated = SQLExec.query(
      "UPDATE Author SET name = 'Baeldung' "
      + "WHERE name = 'Vicky Sarra'")
      .update(context);

    assertEquals(updated, 1);
}

詳細については、https://cayenne.apache.org/docs/4.0/index.html[文書]から入手できます。


8結論

この記事では、Cayenneを使用して簡単で高度なクエリを作成する方法をいくつか紹介しました。

いつものように、この記事のソースコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/apache-cayenne[GitHubに載っています]。