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 leftJoin
s'. 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
.
Vous devez vous connecter pour publier un commentaire.
Il est possible d'utiliser
on()
dans QueryDSL, y compris la dernière version.JPAQuery
prend également en chargeon()
prédicat.Donc cela peut être réalisé,
JPAQuery
implémenteJPQLCommonQuery
interface, de sorte que d'autres, il a toutes les méthodes nécessaires.Voici docs de QueryDSL dernière version avec le bouton gauche de la jointure à l'aide
on()
exemple.Mise à jour:
on()
a été introduit depuis QueryDsl 3.0.0 version. Donc pour les versions ci-dessous 3.0.0 il n'est pas disponible.Je vous suggère de mettre à niveau votre version au moins à 3.0.0, que l'API est assez forte comparant à d'anciennes versions. Même plus, j'avais conseille fortement de mettre à niveau vers la dernière version stable (3.6.2), il ne devrait pas y avoir de problèmes que de nouvelles API prend en charge tout comme avant, avec des fonctionnalités supplémentaires.
Mise à jour 2:
Comme @Cezille07 mentionnées dans le commentaire, il y a un
with()
alternative pouron()
, dans les anciennes versions. Comme nous le voyons dans le question ,with()
a été remplacé paron()
plus tard.Donc pour les versions plus anciennes
with()
fait le tour. Voici un utile lien avec plus de détails.on(...)
il a un message d'erreur "La méthode sur(BooleanExpression) n'est pas défini pour le type JPAQuery". Le sur n'apparaît même pas dans la liste de saisie automatique de fonctions pour JPAQuery.on
expression, vous devez mettre à jour au moins une version 3.0.0. Merci de prendre un coup d'oeil sur mon édité réponse, j'ai inclus cette information là. Espérons que cela aide.with
qui fait ceon
n'. lien Pourriez-vous s'il vous plaît ajouter ce morceau et je vais accepter votre réponse.