Общий querydsl orderBy генерация динамического пути с левыми объединениями

Я столкнулся с проблемой при использовании JPA с Querydsl и Hibernate для управления хранением данных. Пример модели выглядит следующим образом:

@Entity
public class User {
    ....

    @ManyToOne
    @JoinColumn(name = "CATEGORY_ID")
    private Category category;
}

@Entity
public class Category {
    ..
    private String acronym;

    @OneToMany(mappedBy = "category")    
    List<User> userList;    
}

В моем веб-приложении Spring MVC у меня есть поисковая форма с параметрами пользователя и orderBy select. Параметр orderBy может быть либо свойством пользователя, либо свойством категории. Параметры orderBy хранятся в виде Map (fe {"login": "adm", {"firstName": "John"}. Функция поиска получает параметры поиска (в виде строки) и приведенную выше карту с указанием порядка. Упрощенный код для заказа выглядит следующим образом:

Map<String, String> orderByMap = new HashMap<String, String>();
orderByMap.put("firstName", "asc");
orderByMap.put("unit.acronym", "desc");

PathBuilder<User> pbu = new PathBuilder<User>(User.class, "user");

....

for (Map.Entry<String, String> order : orderByMap.entrySet())
{
    // for simplicity I've omitted asc/desc chooser
    query.orderBy(pbu.getString(order.getKey()).asc());
}

Проблема начинается, когда я хочу ввести сортировку по параметру Category, например {"category.acronym", "desc"}. Как объяснилВотПриведенный выше код заставит querydsl использовать перекрестное соединение с таблицей категорий и опустить Пользователи без категорий, что не является ожидаемым поведением.

Я знаю, я должен ввести левое соединение с категориями и использовать псевдоним для сортировки, чтобы заставить его работать, однако я ищу эффективный способ сделать это динамически. Удаление каждой строки в поисках категории или любого другого объекта (например, «user.category.subcategory.propetry») приведет к появлению большого количества уродливого кода, и я бы предпочел этого не делать.

Буду признателен за помощь с более элегантным решением.

Ответы на вопрос(1)

Ваш ответ на вопрос