Я работаю с 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