Querydsl Webサポートのある複数テーブルにわたるRESTクエリ言語

1概要

このチュートリアルでは、リンクの2番目の部分に進みます。関連付けられたエンティティとHTTP経由でクエリを作成する方法について**

パート1で使用したのと同じ構成に従って、Mavenベースのプロジェクトを作成します。基本の設定方法を確認するには、元の記事を参照してください。

2エンティティ

  • 最初に、新しいエンティティ(____Address)を追加して、ユーザーと彼女の住所の間に関係を作成しましょう。

その結果、次のクラスがあります。

@Entity
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @OneToOne(fetch = FetchType.LAZY, mappedBy = "user")
    private Address addresses;

   //getters & setters
}
@Entity
public class Address {

    @Id
    @GeneratedValue
    private Long id;

    private String address;

    private String country;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user__id")
    private User user;

   //getters & setters
}

[[Spring Data Repositories]]

3 Springデータリポジトリ

この時点で、私たちはいつものように各エンティティに一つずつSpring Dataリポジトリを作成しなければなりません。これらのリポジトリはQuerydsl設定を持つことに注意してください。

  • AddressRepository リポジトリを見て、フレームワーク設定がどのように機能するかを説明しましょう:**

public interface AddressRepository extends JpaRepository<Address, Long>,
  QueryDslPredicateExecutor<Address>, QuerydslBinderCustomizer<QAddress> {

    @Override
    default void customize(QuerydslBindings bindings, QAddress root) {
        bindings.bind(String.class)
          .first((SingleValueBinding<StringPath, String>) StringExpression::eq);
    }
}

デフォルトのバインディングを設定するために customize() メソッドをオーバーライドしています。この場合は、すべての __String __プロパティについて、デフォルトのメソッドバインディングが等しいようにカスタマイズします。

リポジトリがすべて設定されたら、HTTPクエリを管理するための @ RestController を追加するだけです。

4クエリレストコントローラ

パート1では、 __user リポジトリに対するQuery @ RestController __について説明しました。ここでは、それを再利用します。

  • また、 address テーブルをクエリしたいかもしれません。そのためには、同様の方法を追加するだけです。**

@GetMapping(value = "/addresses", produces = MediaType.APPLICATION__JSON__VALUE)
public Iterable<Address> queryOverAddress(
  @QuerydslPredicate(root = Address.class) Predicate predicate) {
    BooleanBuilder builder = new BooleanBuilder();
    return addressRepository.findAll(builder.and(predicate));
}

これがどのように機能するのかを確認するためのテストを作成しましょう。

5統合テスト

Querydslがどのように機能するかを証明するテストを含めました。このために、MockMvcフレームワークを使用して、このエンティティと結合する __userを介したHTTPクエリをシミュレートします。属性

  • スペインに住んでいるすべてのユーザーを取得しましょう:**

/users?addresses.country =スペイン

@Test
public void givenRequest__whenQueryUserFilteringByCountrySpain__thenGetJohn() throws Exception {
    mockMvc.perform(get("/users?address.country=Spain")).andExpect(status().isOk()).andExpect(content()
      .contentType(contentType))
      .andExpect(jsonPath("$", hasSize(1)))
      .andExpect(jsonPath("$[0].name", is("John")))
      .andExpect(jsonPath("$[0].address.address", is("Fake Street 1")))
      .andExpect(jsonPath("$[0].address.country", is("Spain")));
}

その結果、QuerydslはHTTP経由で送信された述語をマップし、次のSQLスクリプトを生成します。

select user0__.id as id1__1__,
       user0__.name as name2__1__
from user user0__
      cross join address address1__
where user0__.id=address1__.user__id
      and address1__.country='Spain'

6. 結論

まとめると、Querydslは動的クエリを作成するための非常に単純な代替手段をWebクライアントに提供しています。このフレームワークのもう一つの強力な使い方。

リンク:/rest-api-search-querydsl-web-in-spring-data-jpa[パートI]では、1つのテーブルからデータを取得する方法を説明しました。その結果、今、私たちはいくつかのテーブルを結合するクエリを追加することができ、ウェブクライアントに彼らがするHTTPリクエストを直接フィルタリングするより良い経験を提供します。

この例の実装はhttps://github.com/eugenp/tutorials/tree/master/spring-data-rest-querydsl[GitHubプロジェクトで]チェックできます - これはMavenベースのプロジェクトです。そのままインポートして実行するのは簡単です。