Рубрики
Без рубрики

Язык запросов REST Для нескольких Таблиц с веб-поддержкой Querydsl

Краткое руководство по использованию Querydsl для запросов по связанным сущностям HTTP.

Автор оригинала: baeldung.

1. Обзор

В этом уроке мы продолжим вторую часть веб-поддержки Spring Data Querydsl. Здесь мы сосредоточимся на связанных сущностях и на том, как создавать запросы по протоколу HTTP.

Следуя той же конфигурации, которая использовалась в первой части, мы создадим проект на основе Maven. Пожалуйста, обратитесь к оригинальной статье, чтобы узнать, как настроить основы.

2. Субъекты

Во-первых, давайте добавим новую сущность ( Адрес) , создающую связь между пользователем и его адресом. Мы использовали отношения “Один к одному”, чтобы все было просто.

Следовательно, у нас будут следующие классы:

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

3. Весенние Хранилища Данных

На этом этапе мы должны создать хранилища данных Spring, как обычно, по одному для каждого объекта. Обратите внимание, что эти репозитории будут иметь конфигурацию Querydsl.

Давайте посмотрим на Адрес Репозитория репозиторий и объясните, как работает конфигурация фреймворка:

public interface AddressRepository extends JpaRepository, 
  QuerydslPredicateExecutor
, QuerydslBinderCustomizer { @Override default void customize(QuerydslBindings bindings, QAddress root) { bindings.bind(String.class) .first((SingleValueBinding) StringExpression::eq); } }

Мы переопределяем метод customize () , чтобы настроить привязку по умолчанию. В этом случае мы настроим привязку метода по умолчанию равной для всех свойств String .

Как только репозиторий будет полностью настроен, нам просто нужно добавить @RestController для управления HTTP-запросами.

4. Контроллер запросов Rest

В первой части мы объяснили запрос @RestController над пользователем репозиторием, здесь мы просто повторно его используем.

Кроме того, мы можем запросить адрес таблица; поэтому для этого мы просто добавим аналогичный метод:

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

Давайте создадим несколько тестов, чтобы увидеть, как это работает.

5. Интеграционное тестирование

Мы включили тест, чтобы доказать, как работает Querydsl. Для этого мы используем фреймворк MockMvc для имитации HTTP-запросов над пользователем , соединяющим эту сущность с новым: адресом. Таким образом, теперь мы можем выполнять фильтрацию запросов адреса атрибутов.

Давайте восстановим всех пользователей, живущих в Испании:

/пользователи?адреса.страна=Испания

@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 предлагает веб-клиентам очень простую альтернативу для создания динамических запросов; еще одно мощное использование этой платформы.

В части I мы рассмотрели , как извлекать данные из одной таблицы; следовательно, теперь мы можем добавлять запросы, соединяющие несколько таблиц, предлагая веб-клиентам лучшую фильтрацию непосредственно по HTTP-запросам, которые они делают.

Реализацию этого примера можно проверить в проекте GitHub – это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.