У меня есть проект с 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]