Spring Data: как работает Pageable вместе с @Query? (Интерфейс проекции) - PullRequest
0 голосов
/ 07 мая 2018

Я работаю с 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 метода I могу подтвердить:

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

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

Убедитесь, что вы называете проекты, соответствующие полям проекции.

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

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