Langage de requête REST sur plusieurs tables avec prise en charge de Querydsl Web

1. Vue d’ensemble

Dans ce tutoriel, nous allons continuer avec la deuxième partie du lien:/rest-api-search-querydsl-web-in-spring-data-jpa sur les entités associées et comment créer des requêtes via HTTP. **

En suivant la même configuration que celle utilisée dans la première partie, nous allons créer un projet basé sur Maven. Veuillez vous reporter à l’article d’origine pour savoir comment configurer les bases.

2. Entités

  • Commençons par ajouter une nouvelle entité ( __Address) __creating une relation entre l’utilisateur et son adresse. ** Nous avons utilisé la relation OneToOne pour simplifier les choses.

Par conséquent, nous aurons les classes suivantes:

@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. Dépôts de données Spring

À ce stade, nous devons créer les référentiels Spring Data, comme d’habitude, un pour chaque entité. Notez que ces référentiels auront la configuration de Querydsl.

Voyons le dépôt AddressRepository et expliquons le fonctionnement de la configuration du framework:

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);
    }
}

Nous remplaçons la méthode customize () pour configurer la liaison par défaut. Dans ce cas, nous allons personnaliser la liaison de méthode par défaut pour qu’elle soit égale, pour tous les __String __properties.

Une fois que le référentiel est défini, il suffit d’ajouter un @ RestController pour gérer les requêtes HTTP.

4. Contrôleur de reste de requête

Dans la première partie, nous avons expliqué la requête __ @ RestController sur user __repository. Ici, nous allons simplement la réutiliser.

  • Nous pouvons aussi vouloir interroger la table address ; donc pour cela, nous allons simplement ajouter une méthode similaire: **

@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));
}

Créons quelques tests pour voir comment cela fonctionne.

5. Test d’intégration

Nous avons inclus un test pour prouver le fonctionnement de Querydsl. Pour cela, nous utilisons le framework MockMvc pour simuler des requêtes HTTP sur _user joignant cette entité à la nouvelle: address. Par conséquent, nous pouvons désormais filtrer les requêtes adress_ les attributs.

  • Récupérons tous les utilisateurs résidant en Espagne: **

/utilisateurs? adresses.pays = Espagne

@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")));
}

En conséquence, Querydsl mappera le prédicat envoyé via HTTP et générera le script SQL suivant:

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. Conclusion

En résumé, nous avons vu que Querydsl offre aux clients Web une alternative très simple pour créer des requêtes dynamiques. une autre utilisation puissante de ce cadre.

Dans le lien:/rest-api-search-querydsl-web-in-spring-data-jpa[partie I], nous avons vu comment récupérer les données d’une table; par conséquent, nous pouvons maintenant ajouter des requêtes rejoignant plusieurs tables, offrant ainsi aux clients Web une meilleure expérience de filtrage directement sur les requêtes HTTP qu’ils émettent.

La mise en œuvre de cet exemple peut être vérifiée à l’adresse in le projet GitHub - il s’agit d’un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.