Чтобы собрать только нужные мне данные, я использую следующий запрос для объявления объекта:
@Query(value = "select d.id as id "
+ " , d.statusChanged as statusChanged "
+ " from Declaration d ",
countQuery="select count(id) from Declaration")
Page<DeclarationIDTO> findAllDeclarationListIDTO(Pageable pageable);
DeclarationIDTO
имеет getId()
и getStatusChanged()
.
. Это работает.
Теперь я хочу добавить идентификатор фрилансера следующим образом:
@Query(value = "select d.id as id "
+ " , d.statusChanged as statusChanged "
+ " , f.id as 'freelancer.id' "
+ " from Declaration d join d.freelancer f",
countQuery="select count(id) from Declaration")
Page<DeclarationIDTO> findAllDeclarationListIDTO(Pageable pageable);
У DeclarationIDTO
есть getFreelancer()
с getId()
, но я получаю ошибку:
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting IDENT, found ''freelancer.id'' near line 1, column 66 [select d.id as id , d.statusChanged as statusChanged , f.id as 'freelancer.id' from nl.tibi.sbys.domain.Declaration d join d.freelancer f]
Есть идеи, как работать с цепочкой объектов?
Возможные обходные пути:
1) Сгладить интерфейс:
@Query(value = "select d.id as id "
+ " , d.statusChanged as statusChanged "
+ " , f.id as 'freelancer_id' "
+ " from Declaration d join d.freelancer f",
countQuery="select count(id) from Declaration")
Page<DeclarationIDTO> findAllDeclarationListIDTO(Pageable pageable);
Будет иметь значение IDIDTOgetId (), getStatusChanged () и getFreelancer_id ()
Недостатком является то, что интерфейсу придется копировать все необходимые поля фрилансера, и мне нужно использовать маппер для сопоставления freelancer_id с объектом DTO с помощью freelancer.id
2) работа с конструктором, а не с интерфейсом:
@Query(value = "select new DeclarationDTO(d.id "
+ " , d.statusChanged "
+ " , f.id) "
+ " from Declaration d join d.freelancer f",
countQuery="select count(id) from Declaration")
Page<DeclarationDTO> findAllDeclarationListIDTO(Pageable pageable);
Недостатком является то, что мне потребуется много конструкторов для разных страниц или нужно выбрать пустые значения, загромождающие мой запрос
3)Несколько запросов на объект, это снижение производительности и большая работа.
4) Выберите полные подобъекты:
@Query(value = "select d.id as id "
+ " , d.statusChanged as statusChanged "
+ " , f as freelancer "
+ " from Declaration d join d.freelancer f",
countQuery="select count(id) from Declaration")
Страница findAllDeclarationListIDTO (Pageable pageable);
DeclarationIDTO
имеет getId()
getStatusChanged()
и getFreelancer()
Tв его работах еще много собранных данных, что отрицательно сказывается на производительности.
Если есть простое решение для получения f.id, это решит все недостатки.
Кажется, здесь ответ:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections
Когда время я буду смотреть на это.