Пейджинговая проекция SpringData с LeftJoin с JPA2.1 - PullRequest
0 голосов
/ 02 июля 2019

У меня есть проект с 2.1.4.RELEASE с данными весенней загрузки.

Проект имеет следующие отношения сущностей: ApplicationEntity ApplicationTranslateEntity LanguageEntity Это таблицы отношений локали в базе данных (ManyToMany), с дополнительной таблицей для размещения текста на разных языках, дополнительный столбец в этой таблице (ApplicationTranslateEntity).

ApplicationEntity:

    @Getter
    @Setter
    public class ApplicationEntity {

    @Id
    private Long id;

    private String urlImage;
    private String urlStoreiOS;
    private String urlStoreAndroid;

    @OneToMany(mappedBy = "application")
    Set<ApplicationTranslationEntity> applicationTranslationEntities;

}

ApplicationTranslateEntity:

@Getter
@Setter
public class ApplicationTranslationEntity {
    @EmbeddedId
    ApplicationTranslationKey id;

    @ManyToOne
    @MapsId("application_id")
    @JoinColumn(name = "application_id")
    ApplicationEntity application;

    @ManyToOne
    @MapsId("language_id")
    @JoinColumn(name = "language_id")
    LanguageEntity language;

    @Column(length = 100)
    private String name;

    @Column(length = 1000)
    private String description;

}

Прогноз:

public interface ApplicationProjection {

    Long  getId();
    String getName();
    String getDescription();
    String getUrlImage();
    String getUrlStoreiOS();
    String getUrlStoreAndroid();
}

Хранилище с запросом:

 @Query("select  a.id as id, a.urlImage as urlImage, at.name as name, at.description as description  from ApplicationEntity a left join a.applicationTranslationEntities at on at.language.key = :language")
Page<ApplicationProjection> findAllByLanguage(Pageable pageable, Language language);

Применение контроллера покоя:

 @GetMapping()
Page<ApplicationDto> all(Pageable pageable, @RequestHeader(value= headerAcceptEncoding, required = false) Language language){
    return applicationService.findAll(pageable,language);
}

Все хорошо с нумерацией страниц и сортировки с id. Но когда я пытаюсь выполнить сортировку по имени, которое находится в ApplicationTranslationEntities, я увидел, что hibernate пытается выполнить сортировку в ApplicationEntity, а не в ApplicationTranslateEntity. Зачем это случилось?

Ошибка:

org.hibernate.QueryException: не удалось разрешить свойство: имя: ****** entity.ApplicationEntity [выберите a.id в качестве идентификатора, a.urlImage в качестве urlImage, a.urlStoreiOS в качестве urlStoreiOS, a.urlStoreAndroid в качестве urlStoreAndroid, at.name в качестве имени, at.description в качестве описания от ******. entity.ApplicationEntity левого соединения a.applicationTranslationEntities в at.language.key =: языковой порядок по a.id asc, a.name по возрастанию]; вложенным исключением является java.lang.IllegalArgumentException: org.hibernate.QueryException: не удалось разрешить свойство: name of: ******. entity.ApplicationEntity [выберите a.id в качестве id, a.urlImage в качестве urlImage, a.urlStoreiOS как urlStoreiOS, a.urlStoreAndroid как urlStoreAndroid, at.name как имя, at.description как описание от *******. entity.ApplicationEntity слева присоединить a.applicationTranslationEntities в at.language.key =: упорядочить язык по a.id asc, a.name asc]

1 Ответ

1 голос
/ 02 июля 2019

Вы используете свойство нумерации страниц name, в то время как оно должно быть (idk, который является правильным) либо applicationTranslationEntities.name (путь свойства), либо a.name (согласно пути соединения).

...