Поиск способа динамического добавления префикса имени сущности в свойства вложенных сущностей, указанные в объектах Pageable Sort.Order - PullRequest
0 голосов
/ 13 декабря 2018

В моем приложении я передаю параметры сортировки из пользовательского интерфейса через параметры HTTP-запроса в приложение Spring Data Rest.Моя сущность репозитория JPA содержит сущности @ManyToOne.Данные, которые я отправляю обратно в пользовательский интерфейс, извлекаются из свойств этих вложенных объектов (сотрудник, контакт, businessLine, показанный ниже).Я создал объект Pageable с параметрами сортировки, поступающими из пользовательского интерфейса.Я не хочу жестко кодировать псевдоним сущности для параметров сортировки вручную в моем приложении.Есть ли у вас какие-либо идеи, как я могу это сделать.

Page<BusContact> contacts = busContactRepository.findAll(pageable);

Сущность ..

@Data
@Entity
@Table(name = "BUSCONTACTS")
public class BusContact implements Persistable<String> , Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "id", unique = true)
    @GeneratedValue(generator = "id")
    @GenericGenerator(name = "id", strategy = "uuid2")
    private String id;

    @JsonProperty("Business Line")
    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn(name = "business_line_id", referencedColumnName = "id")
    private BusinessLine businessLine;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn(name = "contact_id", referencedColumnName = "id")
    private Contact contact;

    @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name = "employee_id", referencedColumnName = "id")
    private Employee employee;
...

Параметры сортировки, которые работают

employee.employeeNumber: ASC
employee.company: ASC

Параметры сортировкикоторые не работают

employeeNumber: ASC
company: ASC

Мне нужно вручную определить, какая сущность имеет свойство сортировки, и добавить псевдоним сущности при создании объектов Sort.Order для передачи в Pageable.

new Sort.Order(Sort.Direction.fromString(sortProps[1].trim()), "employee."+sortProps[0].trim())

Аналогично для свойств в объектах 'contact' и 'businessLine', которые я хочу отсортировать.

Одним из решений, которое я пытался, было использование метаданных репозитория и сущности, чтобы определить, какая сущность имеетсвойство, а затем динамически добавить имя объекта в качестве псевдонима.Но попытка получить метаданные была довольно сложной задачей.Я пробовал Репозитории, DefaultRepositoryMetadata.Просто разместите здесь, чтобы увидеть, если у вас есть лучшее решение.Благодаря.

1 Ответ

0 голосов
/ 13 декабря 2018

Наиболее близким решением, которое я нашел, является определение сущности из используемого репозитория и проверка полей сущности, чтобы определить, какие из них соответствуют запрошенным параметрам сортировки, а затем добавление к ним соответствующего префикса сущности.

В порядкеЧтобы найти информацию о сущности, можно использовать защищенный метод getDomainClass () в SimpleJpaRepository.Но так как этот метод защищен, мы можем раскрыть эти детали, расширив этот класс и настроив приложение для использования нашей расширенной реализации SimpleJpaRepository.

Я нашел следующую ссылку, подробно описывающую, как расширить SimpleJpaRepository.

https://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-adding-custom-methods-into-all-repositories/

...