QueryDSL Left Join avec des conditions supplémentaires SUR

Est-il possible de faire la requête suivante dans QueryDSL?

SELECT p.*
FROM parts_table p LEFT JOIN inventory_balance_table i ON 
    (p.part_no = i.part_no 
     AND i.month = MONTH(CURRENT_DATE) 
     AND i.year = YEAR(CURRENT_DATE));

Solde d'inventaire des magasins de données d'inventaire pour chaque numéro de la pièce/du mois/de l'année; j'ai besoin de l'seules les données pour l'année en cours et le mois.

J'ai obtenu la base de jointure gauche en bas:

QPartsTable qParts = QPartsTable.partsTable;
QInventoryBalance qBalance = QInventoryBalance.inventoryBalance;

JPAQuery q = new JPAQuery(em);
q.from(qParts).leftJoin(qParts.inventoryBalance, qBalance);
q.where(...);
List<Part> list = q.list(qParts);

qui rend la bonne sql, mais seulement de se joindre sur le numéro de pièce.

L'résultant pièces sont vérifiées pour la disponibilité des stocks (entre autres choses). La jointure gauche est nécessaire, car j'ai encore besoin de pièces qui n'ont pas d'état des lieux d'entrée encore (nouvelles pièces par exemple). Left join obtiendrez ces sans un correspondant de l'inventaire de l'équilibre, mais l'ajout de month = MONTH(CURRENT_DATE) et la clause where de la requête supprime les lignes sans solde d'inventaire (parce qu'ils n'ont pas de année/mois de données).

Pour la même raison @Where et @Filter serait de supprimer les parties résultant de la liste des pièces et ne sont pas applicables. Malheureusement @Filter et @Where sont les seuls autres résultats que j'obtiens avec une recherche dans Google et ici, sur la SORTE. (Bizarrement le Filtre n'a même pas d'incidence sur la requête, même si les filtres sont activés dans la session...)

La solution la plus simple serait ma question initiale: Comment activer le SQL ci-dessus dans QueryDSL? En général, est-il possible d'ajouter et/ou de la coutume conditions de la clause de la jointure gauche? Quelles sont les solutions alternatives à ce problème?

Merci d'avance!


Mise à jour - Un suivi de la question et une observation: (peut-être cela devrait être une nouvelle question entièrement?)

Après avoir cherché dans la doc, il semble que les anciens blogs démontrant querydsl eu le on() fonction pour leftJoins'. Pourquoi est-ce plus le cas?

SQLQuery (ou HibernateSQLQuery ou une autre variété) a la fonction de (), mais leftJoin() accepte RelationalPath<T>, pas un EntityPath<T> comme JPAQuery n'. Il semble impossible de jeter QClasses à un RelationalPath, donc ce n'est probablement pas la voie à suivre...


Mise à jour 2 - Nous sommes à l'aide de 2.9.0. À l'aide de on() donne une erreur, comme il n'existe pas...

  • C'est parce qu'il n'existe pas dans 2.9.0.
InformationsquelleAutor Cezille07 | 2015-03-04