Общий 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») приведет к появлению большого количества уродливого кода, и я бы предпочел этого не делать.
Буду признателен за помощь с более элегантным решением.