Spring Data: как работает Pageable вместе с @Query? (Проекция интерфейса)

Я работаю с Spring Data для версии 2.0.6.RELEASE

Меня смущает следующее о разбиении на страницы и проекции

Класс домена называется Persona, работает с lombok и аннотируется JPA (@Entity и т. д.)

По поводу проекции у меня следующее:

public interface PersonaProjection {

    String getId();
    String getNombre();
    String getApellido();
    Date getFecha();

}

По поводу репозитория у меня есть следующее:

interface PersonaDataJpaCrudRepository extends PagingAndSortingRepository<Persona, String> {

    Page<PersonaProjection> findAllProjectedBy(Pageable pageable);

}

Пока здесь все работает нормально.

@Controller имеет такой корпус:

@GetMapping(path = "/complete", produces=MediaType.TEXT_HTML_VALUE)
public String findAllComplete(Pageable pageable, Model model){
    logger.info("findAllComplete ...");
    Page<PersonaProjection> personasPage = personaService.findAll(pageable);
    model.addAttribute("personasPage", personasPage);
    return "persona/findAllComplete";
}

Представление основано на Thymeleaf и показывает ожидаемые данные.

Практически три дня назад я работал со следующим:

@Query("SELECT p.id, p.nombre, p.apellido, p.fecha FROM Persona p")
Page<PersonaProjection> findAllProjectedBy(Pageable pageable);

Обратите внимание, что у него есть @Query только для наглядности. Это помогает быстро понять, какие поля извлекаются.

И работал нормально, но сегодня просто до того как без каких-либо изменений, практически представление для этих полей остается в blank, без исключения, через консоль через некоторые специальные варианты метода @Controller, которые я могу подтвердить:

Page request [number: 0, size 10, sort: UNSORTED] 
    PageNumber: 0, PageSize: 10, Offset: 0 
Page 1 of 11 containing com.sun.proxy.$Proxy84 instances 
    Number: 0, NumberOfElements: 10 
    Size: 10, TotalElements: 107, TotalPages: 11 
    PageNumber: 0, PageSize: 10, Offset: 0 

Результат, показанный выше за предыдущие три дня, представляет собой добавление с участием и без к Query.

Проведя исследование, я нашел для этого класса следующий пример:

Где есть следующий метод:

    /**
     * Projection interfaces can be used with manually declared queries, too. Make sure you alias the projects matching
     * the projection fields.
     *
     * @return
     */
    @Query("select c.firstname as firstname, c.lastname as lastname from Customer c")
Collection<CustomerProjection> findsByProjectedColumns();

Обратите внимание на это примечание:

Make sure you alias the projects matching the projection fields.

Таким образом, если я использую:

@Query("SELECT p.id as id, p.nombre as nombre, p.apellido as apellido, p.fecha as fecha FROM Persona p")
Page<PersonaProjection> findAllProjectedBy(Pageable pageable);

Работает, но обратите внимание, это избыточный, это о том, что псевдоним совпадает с именем поля.

Таким образом, следующие вопросы:

  • Почему первая версия @Query работает несколько дней назад, а теперь нет ?. Здесь моя большая путаница. (Я предполагаю, что здесь задействован com.sun.proxy.$Proxy84 instances)
  • Почему обязательно использовать этот псевдоним as в @Query? Это нет, задокументированное в разделе 4.3.11. Прогнозы, более того, нет примера, показывающего, что interface projection работает вместе с @Query.

Вы меняли базовую базу данных несколько дней назад?

galovics 07.05.2018 21:40

Да и нет, в schema ничего не осталось, просто добавлены или вставлены фальшивые записи 100. Изначально было 5 записей, теперь 107. Просто чтобы проверить представление о разбиении на страницы

Manuel Jordan 07.05.2018 21:48

Я имел в виду версию db, другую БД, вы тестировали ее с помощью H2, а теперь вы переключились на обычную БД или что-то в этом роде

galovics 07.05.2018 21:49

Все в runtime с MySQL, я вручную взаимодействую с веб-приложением через веб-браузер. Тестирование с H2. Но эта ситуация отражается только в представлении, где ожидаемые данные не отображаются, эта часть страницы html отображается пустой или без данных, остальные данные о разбивке на страницы, количестве записей и т. д. Отображаются нормально. Таким образом, все данные о прокси не отображаются в представлении.

Manuel Jordan 07.05.2018 21:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
809
0

Другие вопросы по теме