Hibernate выбрать подобъект в интерфейс - PullRequest
0 голосов
/ 15 февраля 2019

Чтобы собрать только нужные мне данные, я использую следующий запрос для объявления объекта:

        @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

Когда время я буду смотреть на это.

1 Ответ

0 голосов
/ 15 февраля 2019

1) Ваш DeclarationIDTO должен иметь конструктор с параметрами id и statusChange, в таком порядке

2) Попробуйте добавить новый оператор в запрос сполное имя:

"select new my.package.DeclarationIDTO(d.id as id, d.statusChanged as statusChanged "
    + " , f.id as 'freelancer.id' "
    + " from Declaration d join d.freelancer f", 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...