Общий 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 userList;
}
В моем веб-приложении Spring MVC у меня есть поисковая форма с параметрами пользователя и orderBy select. Параметр orderBy может быть либо свойством пользователя, либо свойством категории Параметры orderBy хранятся в виде карты (например, {"авторизоваться" : "адм», {"имя" : "Джон»}. Функция поиска получает параметры поиска (в виде строки) и приведенную выше карту с указанием заказа. Упрощенный код для заказа выглядит следующим образом:
Map orderByMap = new HashMap();
orderByMap.put("firstName", "asc");
orderByMap.put("unit.acronym", "desc");
PathBuilder pbu = new PathBuilder(User.class, "user");
....
for (Map.Entry order : orderByMap.entrySet())
{
// for simplicity I've omitted asc/desc chooser
query.orderBy(pbu.getString(order.getKey()).asc());
}
Проблема начинается, когда я хочу ввести сортировку по категориипараметр s, как {"категория "акроним", "по убыванию»}. Как объяснилВотПриведенный выше код заставит querydsl использовать перекрестное соединение с таблицей категорий и опустить Пользователи без категорий, что не является ожидаемым поведением
Я знаю, я должен ввести левое соединение с категориями и использовать псевдоним для сортировки, чтобы заставить его работать, но яищу эффективный способ сделать это динамически. Разбор каждой строки в поисках категории или любого другого объекта (например, "user.category.subcategory.propetry») представлю много уродливого кода и яЯ бы не хотел этого делать.
Буду признателен за помощь с более элегантным решением.