REST-Abfragesprache über mehrere Tabellen mit Querydsl-Webunterstützung

1. Überblick

In diesem Tutorial fahren wir mit dem zweiten Teil des Links fort:/rest-api-search-querydsl-web-in-spring-data-jpa Hier konzentrieren wir uns zu verbundenen Entitäten und zum Erstellen von Abfragen über HTTP.

Nach der gleichen Konfiguration, die in Teil 1 verwendet wurde, erstellen wir ein Maven-basiertes Projekt. Bitte lesen Sie den Originalartikel, um zu erfahren, wie Sie die Grundlagen einrichten.

2. Entitäten

  • Zuerst fügen wir eine neue Entität hinzu ( _Address) _ eine Beziehung zwischen dem Benutzer und ihrer Adresse aufbauen.

Daher haben wir folgende Klassen:

@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 Data Repositories

An diesem Punkt müssen wir wie üblich die Spring Data-Repositorys für jede Entität erstellen. Beachten Sie, dass diese Repositorys die Querydsl-Konfiguration haben.

  • Sehen wir uns das Repository AddressRepository an und erklären Sie, wie die Framework-Konfiguration funktioniert: **

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

Wir überschreiben die Methode customize () , um die Standardbindung zu konfigurieren. In diesem Fall passen wir die Standardmethodenbindung für alle _String _ -Eigenschaften an.

Wenn das Repository fertig ist, müssen Sie lediglich einen @ RestController hinzufügen, um die HTTP-Abfragen zu verwalten.

4. Abfrage-Rest-Controller

Im ersten Teil haben wir die Abfrage __ @ RestController über user __repository erläutert.

  • Vielleicht möchten wir auch die address -Tabelle abfragen. Deshalb fügen wir einfach eine ähnliche Methode hinzu: **

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

Lassen Sie uns einige Tests erstellen, um zu sehen, wie das funktioniert.

5. Integrationstest

Wir haben einen Test beigefügt, um die Funktionsweise von Querydsl zu beweisen. Dazu verwenden wir das MockMvc-Framework, um HTTP-Abfragen über __user zu simulieren. Attribute.

  • Rufen wir alle Benutzer ab, die in Spanien leben: **

/Benutzer? address.country = Spanien

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

Daher ordnet Querydsl das über HTTP gesendete Prädikat zu und generiert das folgende SQL-Skript:

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

Zusammenfassend haben wir gesehen, dass Querydsl den Web-Clients eine sehr einfache Alternative zum Erstellen dynamischer Abfragen bietet. eine weitere starke Nutzung dieses Rahmens.

In Teil I haben wir gesehen, wie man Daten aus einer Tabelle abruft. Infolgedessen können wir jetzt Abfragen hinzufügen, die mehrere Tabellen zusammenfassen, wodurch Web-Clients eine bessere Filterung direkt über die von ihnen gestellten HTTP-Anforderungen erhalten.

Die Implementierung dieses Beispiels kann im GitHub-Projekt unter https://github.com/eugenp/tutorials/tree/master/spring-data-rest-querydsl () überprüft werden. Dies ist ein Maven-basiertes Projekt einfach zu importieren und auszuführen, wie es ist.