Generic querydsl orderBy dynamische Pfadgenerierung mit Left Joins

Bei der Verwendung von JPA mit Querydsl und Hibernate für die Datenspeicherverwaltung ist ein Problem aufgetreten. Das Beispielmodell sieht wie folgt aus:

@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;    
}

In meiner Spring MVC-Webapplikation habe ich ein Suchformular mit Benutzerparametern und orderBy select. Die orderBy-Auswahl kann entweder eine User-Eigenschaft oder eine Category-Eigenschaft sein. Die orderBy-Parameter werden als Map gespeichert (zB {"login": "adm", {"firstName": "John"}. Die Suchfunktion empfängt die Suchparameter (als String) und die obige Map mit Bestellangabe. Der vereinfachte Code Für die Bestellung gilt folgendes:

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());
}

Das Problem beginnt, wenn ich die Sortierung nach Category-Parametern wie {"category.acronym", "desc"} einführen möchte. Wie erklärtHierwird der obige Code Querydsl veranlassen, Cross-Join mit Kategorietabelle zu verwenden und die Benutzer ohne Kategorien wegzulassen, was nicht erwartet wird.

Ich weiß, ich muss den linken Join mit Categories einführen und den Alias ​​für die Sortierung verwenden, damit es funktioniert, nachdem ich nach einer effizienten Möglichkeit gesucht habe, dies dynamisch zu tun. Das Strippen jedes Strings nach einer Kategorie oder einer anderen Entität (wie "user.category.subcategory.propetry") führt eine Menge hässlichen Codes ein, und das würde ich lieber nicht tun.

Ich würde die Hilfe mit einer eleganteren Lösung schätzen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage